封装继承多态通俗理解.docx
《封装继承多态通俗理解.docx》由会员分享,可在线阅读,更多相关《封装继承多态通俗理解.docx(14页珍藏版)》请在冰豆网上搜索。
![封装继承多态通俗理解.docx](https://file1.bdocx.com/fileroot1/2023-6/17/0707a005-f5d9-412f-a2e7-5ed710ccf7a3/0707a005-f5d9-412f-a2e7-5ed710ccf7a31.gif)
封装继承多态通俗理解
封装的概念好比一辆汽车,你学开车的时候只需学会诸如踩油门、刹车,转方向盘即可,无需去了解它的发动机是如何发动。
继承,先说说我对类的理解,类起到的作用有:
分类(你所用某个类创建的对象实际上该类的个案)和模板的作用,那么继承则起到了对类再次分类的作用,比如,有个类“动物”,“哺乳动物”继承“动物”,再往下“马”又继承了“哺乳动物”这个类。
在这里,我们从下往上讲,首先,我们把某种东西划分出来,叫做“马”
(当然还有“牛”,“鱼”等等),接着,我们发现,“马”,“羊”等还有很多共同的特点,于是,我们再次划分出了“哺乳动物”这个类,再次分类,我们则有了“动物”。
但在实际开发中,我们一般是从上往下定义的,即先有了“动物”,再有“哺乳动物”,最后有“马”。
多态,正如上面朋友所说一重写,二重载。
用汉字来打个比方,比如“开”这个字,在不同的时候各有的意思,比如“开门”,“开窗”,甚至有“开车”,“开饭”等,具有相同名称但操作不同。
具体的实现我就不累述了。
说说接口吧,在JAVA不支持多继承的,实际上接口起到了类似多继承的作用,一个类只能继承另一个类(或抽象类)但可以实现多个接口。
打个比方,“张三”,他是一个“人”,因此他继承了“人”;与此同时,他是一个“司机”,他的平时行为还有“开车”,很显然,这并不能从“人”这个类里继承下来。
怎么办?
JAVA里只支持单继承,这个时候,接口就起到了作用,它定义了“司机”这个接口,“张三”实现了它,因此,他会开车了。
}
2:
{
封装:
就象一个盒子,你不需要知道里面有什么东西,只知道它有那些用处就行继承:
就象父子关系,儿子是父亲的继承
多态:
好比一个父亲有多个儿子,各个儿子有不同的特征
}
3:
{
封装(Encapsulation):
封装是一个面向对象的概念,对外部世界,隐藏类的内部.
封装优点:
1.好的封装能减少耦合.
2.类的内部的实现可以自由改变.
3.一个类有更清楚的接口.
DataHiding(数据隐藏):
封装的一个最有用的形式是数据隐藏.一个类的数据表现一个对象的状态.修饰符支持封装:
Private:
只有类本身能存取.
Protected:
类和派生类可以存取.
Internal:
只有同一个项目中的类可以存取.
ProtectedInternal:
是Protected和Internal的结合.
Public:
完全存取.
otherEncapsulatingStrategy:
(其他封装策略)属性和索引器的目的是封装一个类的细节和给类的用户提供一个公共的接口.
封装和继承的关系:
封装的意思是包容(聚合),类与类之间的关系是"hasa".一个类里面有另一个类.继承,类与类之间的关系是"isa".
多态(Polymorphism):
就是怎样重载一个虚拟类.多态是面向对象的重要概念.
ImplementingPolymorphism(实现多态):
例子:
usingSystem;
publicclassWebSite
{
publicstringSiteName;
publicstringURL;
publicstringDescription;
publicWebSite()
{
}
publicWebSite(stringstrSiteName,stringstrURL,stringstrDescription)
{
SiteName=strSiteName;
URL=strURL;
Description=strDescription;
}
publicoverridestringToString()
{
returnSiteName+","+
URL+","+
Description;
}
}
abstractpublicclassContact
{
publicvirtualstringUpdateNotify()
{
return"WebSiteChangeNotification";
}
}
publicclassCustomer:
Contact
{
publicnewstringUpdateNotify()
{
return@"
Thisistoletyouknowyourfavoritesite,FinancialTimes,hasbeenupdatedwithnewlinks";
}
}
publicclassSiteOwner:
Contact
{
WebSitemySite;
publicSiteOwner(stringaName,WebSiteaSite){
mySite=newWebSite(aSite.SiteName,aSite.URL,aSite.Description);
}
publicnewstringUpdateNotify()
{
return@"
Thisistoletyouknowyoursite,"+"\n"+mySite.SiteName+@",hasbeenaddedasalinktoFinancialTimes.";
}
}
publicclassTest
{
publicstaticvoidMain()
{
WebSiteleFin=newWebSite("LeFinancier",
"http:
//www.LeF","FancyFinancialSite");
Contact[]Contacts=newContact[2];
Contacts[0]=newSiteOwner("PierreDoe",leFin);
Contacts[1]=newCustomer();
foreach(ContactpocinContacts)
{if(pocisSiteOwner)
{
Console.WriteLine("Message:
{0}\n",((SiteOwner)poc).UpdateNotify());
}
else
{
Console.WriteLine("Message:
{0}\n",((Customer)poc).UpdateNotify());
}
}
}
}
在例子中,Contact类有个虚拟方法,有两个派生类分别实现.使用了"new"关键字.可以有更有效和优雅的方法,实现它,就是多态.
例子:
usingSystem;abstractpublicclassContact{
publicvirtualstringUpdateNotify()
{
return"WebSiteChangeNotification";
}
}
publicclassCustomer:
Contact
{
publicoverridestringUpdateNotify()
{
return@"
Thisistoletyouknowyourfavoritesite,FinancialTimes,hasbeenupdatedwithnewlinks";
}
}
publicclassSiteOwner:
Contact
{
stringsiteName;
publicSiteOwner(stringsName)
{
siteName=sName;
}
publicoverridestringUpdateNotify()
{
return@"
Thisistoletyouknowyoursite,"+"\n"+siteName+@",hasbeenaddedasalinktoFinancialTimes.";
}
}publicclassTest
{
publicstaticvoidMain()
{
Contact[]Contacts=newContact[2];
Contacts[0]=newSiteOwner("LeFinancier");
Contacts[1]=newCustomer();
foreach(ContactpocinContacts)
{
Console.WriteLine("Message:
{0}\n",poc.UpdateNotify());
}
}
}
例子中,派生类用"override"实现了多态.
虚拟方法是允许多态工作的基类的方法.用"override"修饰符说明,能被派生类重载.虚拟方法和抽象方法的不同
时,虚拟方法有实现,抽象方法没有.抽象方法,隐式说明是虚拟,必须被重载;虚拟方法不必被重载.
多态,必须是虚拟方法,而且,方法的签名必须一致,包括方法名称,参数,和参数类型.例子:
abstractpublicclassContact
{
publicvirtualstringUpdateNotify()
{
return"WebSiteChangeNotification";
}
}
publicclassCustomer:
Contact
{
publicoverridestringSendMail(){}//error
publicoverridestringUpdateNotify(intnumber){}//error
}
例子中,SendMail不是虚拟方法,故错误;UpdateNotify,带有不同的参数,故也错误.
new和override修饰符,都可以实现新的方法.但,new实现的是派生类新的方法例子:
usingSystem;
abstractpublicclassContact
{
publicvirtualstringUpdateNotify()
{
return"WebSiteChangeNotification";
}
}
publicclassCustomer:
Contact
{
publicnewstringUpdateNotify()
{
return@"
Thisistoletyouknowyour
favoritesite,FinancialTimes,
hasbeenupdatedwithnewlinks";
}
}
publicclassSiteOwner:
Contact
{
stringsiteName;
publicSiteOwner(stringsName)
{
siteName=sName;
publicoverridestringUpdateNotify()
{
return@"
Thisistoletyouknowyoursite,"+"\n"+siteName+@",hasbeenaddedasalinktoFinancialTimes.";
}
}
publicclassTest
{
publicstaticvoidMain()
{
Contact[]Contacts=newContact[2];
Contacts[0]=newSiteOwner("LeFinancier");
Contacts[1]=newCustomer();
foreach(ContactpocinContacts)
{
Console.WriteLine("Message:
{0}\n",poc.UpdateNotify());
}
}
}
结果是:
Message:
Thisistoletyouknowyoursite,LeFinancier,hasbeenaddedasalinktoFinancialTimes.
Message:
WebSiteChangeNotification
例子中,Customer用"new"实现新的方法,但是,在运行是不是多态.仍然调用基类的方法
Most-DerivedImplementations(多重派生实现)
PolymorphicProperties(多态的属性):
C#允许,属性的多态实现.例子:
usingSystem;
publicclassSiteStats
{
publicintnumberOfVisits=0;
abstractpublicclassContact
{
protectedstringname;
publicvirtualstringName
{
get
{
returnname;
}
set
{
name=value;
}
}
}
publicclassCustomer:
Contact
{
SiteStatsmyStats=newSiteStats();
publicoverridestringName
{
get
{
myStats.numberOfVisits++;
Console.WriteLine("Numberofvisits:
{0}",myStats.numberOfVisits);
returnname;
}
set
{
base.Name=value;
myStats.numberOfVisits=0;
Console.WriteLine("Name:
{0}",Name);
}
}
}
publicclassTest
{
publicstaticvoidMain()
ContactmyContact=newCustomer();myContact.Name="George";
}
}
例子中,抽象类,有属性Name,派生类重载实现了属性
PolymorphicIndexers(多态的索引器):
索引器的多态例子:
usingSystem;
usingSystem.Collections;
publicclassSiteList
{
protectedSortedListsites;
publicSiteList()
{
sites=newSortedList();
}
publicintNextIndex
{
get{
returnsites.Count;
}
}
publicvirtualstringthis[intindex]
{
get
{
return(string)sites.GetByIndex(index);
}
set
{
sites[index]=value;
}
}
}
publicclassFinancialSiteList:
SiteList
{
publicoverridestringthis[intindex]
{
get
{
Console.WriteLine("FinancialSiteListIndexerGet");if(index>sites.Count)
return(string)null;
returnbase[index];
}
set
{
Console.WriteLine("FinancialSiteListIndexerSet");base[index]=value;
}
}
}
classSiteManager
{
SiteListsites=newSiteList();
publicstaticvoidMain()
{
SiteManagermgr=newSiteManager();
mgr.sites=newFinancialSiteList();
mgr.sites[mgr.sites.NextIndex]="GreatSite!
";
Console.WriteLine("Site:
{0}",
mgr.sites[0].ToString());
}
}
例子中,基类的索引器是"virtual",派生类重载了索引器}