今天你多态了吗?

今天你多态了吗?

Do You Polymorphism Today? [0]

Writen by Allen Lee

-1. 目录

  • -1. 目录
  • 0. 写在前面的话。
    • 0.0 关键字。
    • 0.1 系统要求?!
    • 0.2 如何阅读本文?
  • 1. 图书馆魔术事件簿。
    • 1.0 图书管理员的烦恼。
    • 1.1 魔术棒是如何工作的?
    • 1.2 魔术般真能起作用吗?
    • 1.3 我们在干什么?
    • 1.4 Poly呢?
  • 2. 多态为何物?
    • 2.0 真实的多态。
    • 2.1 多态的种类。
    • 2.2 多态失效了?
    • 2.3 要睡觉了吗?
  • 3. 多态与重构。
    • 3.0 请别妨碍我们改善公司的组织结构!
    • 3.1 Poly的噩梦——图书馆的倒塌。
  • 4. 完结·新篇。
  • 5. 参考书目。
  • X. 注释。

0. 写在前面的话。

0.0 关键字。

  • 中文:多态,面向对象,继承,封装,抽象类,重构,基类,基类继承多态,接口,接口继承多态,抽象方法,虚方法,重载方法,继承体系,插件系统,引用类型,值类型,接口多重继承
  • 英文:Polymorphism, Object-Oriented, Inheritance, Encapsulation, abstract class, base class, Refactoring, interface, abstract method, virtual method, overriden method, override, new, Null Object Pattern, reference type, value type, switch

0.1 系统要求?!

  • 0.1.0 使用面向对象技术(至少有使用的打算)。
  • 0.1.1 对C#有一个基本的了解(我指的是语法以及相关的概念)。
  • 0.1.2 初步了解面向对象的继承以及封装(如果没有了解...就看着办吧!)。
  • 0.1.3 希望了解多态及其相关的内容。
  • 0.1.4 必要的耐性(至少你应该看完“如何阅读本文?”。连“如何阅读本文?”都看不进?关掉浏览器吧!)。
  • 0.1.5 其它......

0.2 如何阅读本文?

None.gifswitch(you.Purpose)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
case"希望读一个关于多态的故事“
InBlock.gif
if(you.IsPatient)
InBlock.gif
goto"1.图书馆魔术事件簿";
InBlock.gif
InBlock.gif
case"因为《readonlyvs.const》的Remark的最后一点而来":
InBlock.gif
goto"2.0真实的多态";
InBlock.gif
InBlock.gif
case"仅希望了解一下多态的种类":
InBlock.gif
goto“2.1多态的种类”
InBlock.gif
InBlock.gif
case"仅希望了解一下不同种类的多态的注意事项":
InBlock.gif
goto“2.2多态失效了?”
InBlock.gif
InBlock.gif
case"只想知道我是如何回答'何谓多态?'":
InBlock.gif
goto“2.3要睡觉了吗?”;
InBlock.gif
InBlock.gif
case"希望了解多态如何帮助你实现更灵活的条件扩展机制":
InBlock.gif
goto“3.0请别妨碍我们改善公司的组织结构”;
InBlock.gif
InBlock.gif
case"希望了解NullObject模式以及IntroduceNullObject重构原则如何发挥多态的威力":
InBlock.gif
goto“3.1Poly的噩梦——图书馆的倒塌”;
InBlock.gif
InBlock.gif
case"想听听我对多态的闲谈":
InBlock.gif
goto“4.完结·新篇”;
InBlock.gif
InBlock.gif
case"只想活动一下因使用鼠标而劳累的手":
InBlock.gif
goto"关闭你的浏览器";
InBlock.gif
InBlock.gif
defatul:
InBlock.gif
goto"从头到尾阅读本文";
InBlock.gif
ExpandedBlockEnd.gif}

1. 图书馆魔术事件簿[1]。

1.0 图书管理员的烦恼。

  • Poly:学校这几年扩招,图书馆也有一大批新书入库,而管理员却还是只有我们两个,每天都忙个不停angry_smile.gif
  • Morph:没办法啦,这总比失业好吧?
  • Poly:哎,每天单处理归还的书的工作就叫人喘不了气了,如果这些书能够自动飞回各自所属的位置该多好呀75_75.gif
  • Morph:来,我赐你一把魔术棒,这样你就不用那么辛苦了wink_smile.gif
  • Poly:拜托!不要拿支牙刷来耍我,今天的工作恐怕又干不完了,没空跟你开玩笑呀angry_smile.gif
  • Morph:呵呵,谁叫你有这种闲情发白日梦?

1.1 魔术棒是如何工作的呢?

刚刚才被Morph耍完的Poly现在又在发白日梦了,他想着Morph提到的魔术棒,自言自语:“如果真的有这么一支魔术棒,它将如何工作呢?”

他联想到自己平时工作的情况,认为要把图书归类好,必须满足以下两个条件:

  • a) 每本图书都应该具有一些信息,这些信息描述了该书的所属类别以及存放地点等;
  • b) 有一头任劳任怨的牛根据这些信息把书拿到存放地点放好。

想着想着,Poly奏起眉头了:“这么说来,我不就是那头牛sad_smile.gif?不行,我得让魔术棒帮帮我!”于是,Poly又陷入沉思了72_72.gif:如果这些书懂得自己飞回它所属的存放地点的话......对了,得让魔术棒帮我这个忙!

1.2 魔术棒真能起作用吗?

1.2.0 现实中的Poly是如何工作的?

None.gif class Poly
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
staticvoidMain()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//图书馆早上准时开门;
InBlock.gif
Librarylibrary=newLibrary();
InBlock.gif
InBlock.gif
//当然,Poly他们没有理由只开图书馆的大门,他们还要开放图书馆的各层楼。
InBlock.gif
//一楼的门就是大门了,要开两次大门吗?
InBlock.gif
Floorfloor2=library.Floor2;
InBlock.gifFloorfloor3
=library.Floor3;
InBlock.gifFloorfloor4
=library.Floor4;
InBlock.gif
InBlock.gif
//同学们一大早就归还很多图书。
InBlock.gif
List<Book>books=newList<Book>();
InBlock.gif
//省略填充books列表的代码dot.gif
InBlock.gif
//dot.gif
InBlock.gif
InBlock.gif
//我们认为Poly会先把书分类好属于哪一层楼,然后再一次过搬到对应的楼层,
InBlock.gif
//而不是傻乎乎的每拿到一本书就跑到对应的楼层并把它放入对应的书架!
InBlock.gif
List<Book>floor2Car=newList<Book>();
InBlock.gifList
<Book>floor3Car=newList<Book>();
InBlock.gifList
<Book>floor4Car=newList<Book>();
InBlock.gif
InBlock.gif
//Poly需要根据每本书上的信息进行处理dot.gif
InBlock.gif
foreach(Bookbookinbooks)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//首先看看该书属于图书馆那一层楼的。
InBlock.gif
switch(book.FloorNumberString)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//一楼是图书馆办公室和借书柜台,不用于存放图书。
InBlock.gif
case"2nd":
InBlock.gif
//把书放进往二楼的推车里。
InBlock.gif
floor2Car.Add(book);
InBlock.gif
break;
InBlock.gif
case"3rd":
InBlock.gif
//把书放进往三楼的推车里。
InBlock.gif
floor3Car.Add(book);
InBlock.gif
break;
InBlock.gif
case"4th":
InBlock.gif
//把书放进往四楼的推车里。
InBlock.gif
floor4Car.Add(book);
InBlock.gif
break;
InBlock.gif
InBlock.gif
//default:
InBlock.gif
////把书放进哪里?地下室?还是天台?
InBlock.gif
//break;
ExpandedSubBlockEnd.gif
}

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//接着Poly把往二楼的车推到二楼。
InBlock.gif
//我们认为Poly会先把书按照所属类别分类好,放在装书篮里,
InBlock.gif
//而不是傻乎乎的每拿到一本书就往对应的书架跑。
InBlock.gif
List<Book>mathBasket=newList<Book>();
InBlock.gifList
<Book>physicsBasket=newList<Book>();
InBlock.gifList
<Book>chemistryBasket=newList<Book>();
InBlock.gif
InBlock.gif
foreach(Bookbookinfloor2Car)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
switch(book.Catalog)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
case"Math":
InBlock.gifmathBasket.Add(book);
InBlock.gif
break;
InBlock.gif
case"Physics":
InBlock.gifphysicsBasket.Add(book);
InBlock.gif
break;
InBlock.gif
case"Chemistry":
InBlock.gifchemistryBasket.Add(book);
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//然后Poly提着篮子跑到对应的书架dot.gif
InBlock.gif
foreach(BookbookinmathBasket)
InBlock.giffloor2.MathShelves.Add(book)
InBlock.gif
InBlock.gif
foreach(BookbookinphysicsBasket)
InBlock.giffloor2.PhysicsShelves.Add(book);
InBlock.gif
InBlock.gif
foreach(BookbookinchemistryBasket)
InBlock.giffloor2.ChemistryShelves.Add(book);
InBlock.gif
InBlock.gif
//接着Poly把往三楼的车推到三楼。
InBlock.gif
//我们同样认为Poly会先把书按照所属类别分类好,放在装书篮里,
InBlock.gif
//而不是傻乎乎的每拿到一本书就往对应的书架跑。
InBlock.gif
List<Book>economicsBasket=newList<Book>();
InBlock.gifList
<Book>marketingBasket=newList<Book>();
InBlock.gifList
<Book>managementBasket=newList<Book>();
InBlock.gif
InBlock.gif
foreach(Bookbookinfloor3Car)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
switch(book.Catalog)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
case"Economics":
InBlock.gifeconomicsBasket.Add(book);
InBlock.gif
break;
InBlock.gif
case"Marketing":
InBlock.gifmarketingBasket.Add(book);
InBlock.gif
break;
InBlock.gif
case"Management":
InBlock.gifmanagementBasket.Add(book);
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//然后Poly提着篮子跑到对应的书架dot.gif
InBlock.gif
foreach(BookbookineconomicsBasket)
InBlock.giffloor3.EconomicsShelves.Add(book)
InBlock.gif
InBlock.gif
foreach(BookbookinmarketingBasket)
InBlock.giffloor3.MarketingShelves.Add(book);
InBlock.gif
InBlock.gif
foreach(BookbookinmanagementBasket)
InBlock.giffloor3.ManagementShelves.Add(book);
InBlock.gif
InBlock.gif
//接着Poly把往四楼的车推到四楼。
InBlock.gif
//如果Poly傻乎乎的每拿到一本书就往对应的书架跑,那我们只好让他跑了。
InBlock.gif
List<Book>programmingBasket=newList<Book>();
InBlock.gifList
<Book>seBasket=newList<Book>();
InBlock.gifList
<Book>databaseBasket=newList<Book>();
InBlock.gifList
<Book>networkBasket=newList<Book>();
InBlock.gif
InBlock.gif
foreach(Bookbookinfloor4Car)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
switch(book.Catalog)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
case"Programming":
InBlock.gifprogrammingBasket.Add(book);
InBlock.gif
break;
InBlock.gif
case"SoftwareEngineering":
InBlock.gifseBasket.Add(book);
InBlock.gif
break;
InBlock.gif
case"Database":
InBlock.gifdatabaseBasket.Add(book);
InBlock.gif
break;
InBlock.gif
case"Network":
InBlock.gifnetworkBasket.Add(book);
InBlock.gif
break;
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
//然后Poly提着篮子跑到对应的书架dot.gif
InBlock.gif
foreach(BookbookinprogrammingBasket)
InBlock.giffloor4.ProgrammingShelves.Add(book)
InBlock.gif
InBlock.gif
foreach(BookbookinseBasket)
InBlock.giffloor4.SEShelves.Add(book)
InBlock.gif
InBlock.gif
foreach(BookbookinphysicsBasket)
InBlock.giffloor4.DatabaseShelves.Add(book);
InBlock.gif
InBlock.gif
foreach(BookbookinchemistryBasket)
InBlock.giffloor4.NetworkShelves.Add(book);
InBlock.gif
InBlock.gif
//最后,Poly整个人躺在地上dot.gif
InBlock.gif

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

1.2.1 Poly,我终于理解你的呐喊了!

说实话,直道我完成这个代码,我才真正明白为何Poly一直在烦闷,我想,这个代码应该可以令校方领导下决心改善图书馆的工作环境,至少也得请多几个人来分担一下工作。否则,某天学校突然决定要为图书馆加楼层、增加新的图书类别或者调整图书现有类别时,Poly会毅然决定逃去参军(失业大军)!不信,你试着把第二书店的电脑书部分分类加入到图书馆的4楼,合并3楼现有的类别,并增加文学、宗教等系列的新类别,然后......怎么样?有什么感觉?牵一发而动全身!

1.2.2 Poly决定挥动手上的魔术棒:

Poly手上的魔术棒叫什么名字呢?既然是Morph“赐”的,就叫他Morphism吧!好了,Poly挥动他手上的Morphism魔术棒...

None.gif class Polymorphism
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
staticvoidMain()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
//图书馆早上准时开门;
InBlock.gif
Librarylibrary=newLibrary();
InBlock.gif
InBlock.gif
//怎么每天只需开大门其他楼层的门就自动打开了吗?
InBlock.gif
//Floorfloor1dot.gif
InBlock.gif
InBlock.gif
//同学们一大早就归还很多图书。
InBlock.gif
List<Book>books=newList<Book>();
InBlock.gif
//省略填充books列表的代码dot.gif
InBlock.gif
//dot.gif
InBlock.gif
InBlock.gif
//果然每本书自己飞回各自所属的原位哟。
InBlock.gif
foreach(Bookbookinbooks)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifbook.Return(library);
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif
None.gif
abstract class Book
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
publicabstractvoidReturn(Librarylibrary);
ExpandedBlockEnd.gif}

None.gif
ExpandedBlockStart.gifContractedBlock.gif
abstract class Floor2Book:Book dot.gif {}
None.gif
ExpandedBlockStart.gifContractedBlock.gif
abstract class Floor3Book:Book dot.gif {}
None.gif
ExpandedBlockStart.gifContractedBlock.gif
abstract class Floor4Book:Book dot.gif {}
None.gif
None.gif
class MathBook:Floor2Book
ExpandedBlockStart.gifContractedBlock.gif
<think>我们之前已经讨论过C++中struct和class的区别,但用户这次特别询问了struct是否支持封装、继承和多态,需要更具体地回答。 注意:用户的问题分为两部分:1.区别是什么?2.struct是否支持封装、继承和多态? 回答需覆盖这两点,并保持格式要求。</think>在C++中,`struct`和`class`本质相同,核心区别仅在于**默认访问权限**,但两者都完全支持面向对象特性: ### 核心区别:默认访问权限 | 特性 | `struct` | `class` | |--------------|----------------|----------------| | **默认成员权限** | `public` | `private` | | **默认继承权限** | `public` | `private` | ### 面向对象特性支持(struct完全支持) 1. **封装** ✅ 支持:通过显式添加`private`/`protected`实现数据隐藏 ```cpp struct Person { private: // 显式声明私有成员 std::string idCard; public: void showID() { /* 访问私有成员 */ } }; ``` 2. **继承** ✅ 支持:默认公有继承(可显式指定`protected`/`private`继承) ```cpp struct Student : public Person { // 公有继承 int grade; }; ``` 3. **多态** ✅ 支持:通过虚函数实现运行时多态 ```cpp struct Shape { virtual void draw() = 0; // 纯虚函数 }; struct Circle : Shape { void draw() override { /* 实现多态 */ } }; ``` ### 使用场景建议 - **用`struct`**:数据聚合(如坐标点`Point`)、POD类型(与C兼容)、默认需要公有权限的简单对象 - **用`class`**:需要严格封装的复杂对象(如银行账户)、强调私有实现的模块 > ⚠️ **重要说明**:C++标准(ISO/IEC 14882)明确表示两者仅在默认访问权限上有差异(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值