`
junli0411
  • 浏览: 139221 次
  • 来自: ...
社区版块
存档分类
最新评论

今天你多态了吗?

阅读更多

今天你多态了吗?

Do You Polymorphism Today? [0]

 

Written 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 如何阅读本文?

switch(you.Purpose)
{
  
case "希望读一个关于多态的故事“
    
if(you.IsPatient)
      
goto "1. 图书馆魔术事件簿";

  
case "因为《readonly vs. const》的Remark的最后一点而来":
    
goto "2.0 真实的多态";

  
case "仅希望了解一下多态的种类":
    
goto “2.1 多态的种类”

  
case "仅希望了解一下不同种类的多态的注意事项":
    
goto “2.2 多态失效了?”

  
case "只想知道我是如何回答'何谓多态?'":
    
goto “2.3 要睡觉了吗?”;

  
case "希望了解多态如何帮助你实现更灵活的条件扩展机制":
    
goto “3.0 请别妨碍我们改善公司的组织结构”;

  
case "希望了解Null Object模式以及Introduce Null Object重构原则如何发挥多态的威力":
    
goto “3.1 Poly的噩梦——图书馆的倒塌”;

  
case "想听听我对多态的闲谈":
    
goto “4. 完结·新篇”;

  
case "只想活动一下因使用鼠标而劳累的手":
    
goto "关闭你的浏览器";

  
default:
    
goto "从头到尾阅读本文";

}

 

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

1.0 图书管理员的烦恼。

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

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

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

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

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

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

1.2 魔术棒真能起作用吗?

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

class Poly
{
  
static void Main()
  
{
    
// 图书馆早上准时开门;
    Library library = new Library();

    
// 当然,Poly他们没有理由只开图书馆的大门,他们还要开放图书馆的各层楼。
    
// 一楼的门就是大门了,要开两次大门吗?
    Floor floor2 = library.Floor2;
    Floor floor3 
= library.Floor3;
    Floor floor4 
= library.Floor4;
    
    
// 同学们一大早就归还很多图书。
    List<Book> books = new List<Book>();
    
// 省略填充books列表的代码
    
// 

    
// 我们认为Poly会先把书分类好属于哪一层楼,然后再一次过搬到对应的楼层,
    
// 而不是傻乎乎的每拿到一本书就跑到对应的楼层并把它放入对应的书架!
    List<Book> floor2Car = new List<Book>();
    List
<Book> floor3Car = new List<Book>();
    List
<Book> floor4Car = new List<Book>();
    
    
// Poly需要根据每本书上的信息进行处理
    foreach(Book book in books)
    
{
      
// 首先看看该书属于图书馆那一层楼的。
      switch(book.FloorNumberString)
      
{
        
// 一楼是图书馆办公室和借书柜台,不用于存放图书。
        case "2nd":
          
// 把书放进往二楼的推车里。
          floor2Car.Add(book);
          
break;
        
case "3rd":
          
// 把书放进往三楼的推车里。
          floor3Car.Add(book);
          
break;
        
case "4th":
          
// 把书放进往四楼的推车里。
          floor4Car.Add(book);
          
break;

        
// default:
        
//  // 把书放进哪里?地下室?还是天台?
        
//  break;
      }

    }


    
// 接着Poly把往二楼的车推到二楼。
    
// 我们认为Poly会先把书按照所属类别分类好,放在装书篮里,
    
// 而不是傻乎乎的每拿到一本书就往对应的书架跑。
    List<Book> mathBasket = new List<Book>();
    List
<Book> physicsBasket = new List<Book>();
    List
<Book> chemistryBasket = new List<Book>();

    
foreach(Book book in floor2Car)
    
{
      
switch(book.Catalog)
      
{
        
case "Math":
          mathBasket.Add(book);
          
break;
        
case "Physics":
          physicsBasket.Add(book);
          
break;
        
case "Chemistry":
          chemistryBasket.Add(book);
          
break;
      }

    }


    
// 然后Poly提着篮子跑到对应的书架
    foreach(Book book in mathBasket)
      floor2.MathShelves.Add(book)

    
foreach(Book book in physicsBasket)
      floor2.PhysicsShelves.Add(book);

    
foreach(Book book in chemistryBasket)
      floor2.ChemistryShelves.Add(book);

    
// 接着Poly把往三楼的车推到三楼。
    
// 我们同样认为Poly会先把书按照所属类别分类好,放在装书篮里,
    
// 而不是傻乎乎的每拿到一本书就往对应的书架跑。
    List<Book> economicsBasket = new List<Book>();
    List
<Book> marketingBasket = new List<Book>();
    List
<Book> managementBasket = new List<Book>();

    
foreach(Book book in floor3Car)
    
{
      
switch(book.Catalog)
      
{
        
case "Economics":
          economicsBasket.Add(book);
          
break;
        
case "Marketing":
          marketingBasket.Add(book);
          
break;
        
case "Management":
          managementBasket.Add(book);
          
break;
      }

    }


    
// 然后Poly提着篮子跑到对应的书架
    foreach(Book book in economicsBasket)
      floor3.EconomicsShelves.Add(book)

    
foreach(Book book in marketingBasket)
      floor3.MarketingShelves.Add(book);

    
foreach(Book book in managementBasket)
      floor3.ManagementShelves.Add(book);

    
// 接着Poly把往四楼的车推到四楼。
    
// 如果Poly傻乎乎的每拿到一本书就往对应的书架跑,那我们只好让他跑了。
    List<Book> programmingBasket = new List<Book>();
    List
<Book> seBasket = new List<Book>();
    List
<Book> databaseBasket = new List<Book>();
    List
<Book> networkBasket = new List<Book>();

    
foreach(Book book in floor4Car)
    
{
      
switch(book.Catalog)
      
{
        
case "Programming":
          programmingBasket.Add(book);
          
break;
        
case "Software Engineering":
          seBasket.Add(book);
          
break;
        
case "
分享到:
评论

相关推荐

    hibernate的多态查询

    标题“hibernate的多态查询”指的是在Hibernate框架中,如何进行涉及不同子类的对象查询,这是ORM(对象关系映射)中的一个重要特性,旨在提高代码的灵活性和可扩展性。多态查询允许我们编写一次查询,而无需关心...

    java的编译时多态和运行时多态

    Java 编译时多态和运行时多态 Java 编译时多态和运行时多态是 Java 语言中两个重要的概念,它们都是多态性的实现方式,但它们在实现机制和应用场景上有所不同。 编译时多态 编译时多态是指在编译期根据参数列表的...

    labview创建多态VI

    LabVIEW(Laboratory Virtual ...通过以上步骤,你可以在LabVIEW中创建出强大的多态VI,实现对不同数据类型的一体化处理。这种编程方式不仅提高了代码的效率,还减少了重复劳动,是LabVIEW开发中的一个重要技巧。

    一个HW 多态题目 一个HW 多态题目

    接着,我们来看多态的两种主要形式:编译时多态和运行时多态。编译时多态通常通过函数重载和运算符重载实现,编译器在编译阶段就能确定调用哪个函数。而运行时多态则是在程序运行时才决定调用哪个函数,这是通过虚...

    C#中多态、重载、重写区别分析

    在C#编程语言中,多态(Polymorphism)、重载(Overloading)和重写(Overriding)是面向对象编程的三个核心概念,它们分别提供了不同的功能和灵活性。下面我们将详细探讨这三个概念以及它们之间的区别。 首先,...

    多态代码实例

    本文将通过两个具体的代码实例,帮助你深入理解和掌握多态和虚函数的用法。 首先,我们需要理解多态的基本定义。多态是指一个接口可以有多种不同的表现形式或行为。在面向对象编程中,多态分为静态多态(编译时多态...

    java多态小结

    #### 什么是多态? 多态(Polymorphism)是面向对象编程的一个核心特性,指的是一个接口可以被多个类所实现或一个类可以被多个类所继承,进而表现出不同的行为。在Java中,多态主要体现在两个方面:**编译时类型与...

    Java 多态应用,掌握多态

    在Java编程语言中,多态性(Polymorphism)是面向对象编程的三大特性之一,另外两个...对于给定的压缩包文件"com多态",可能包含了相关的示例代码或者练习,这些可以帮助你更直观地理解并掌握多态在实际编程中的应用。

    多态的练习案例

    在编程领域,多态(Polymorphism)是面向对象编程中的一个重要概念,它允许我们用一个接口处理多种不同的数据类型。多态性使得程序更加灵活,可扩展性更强,能够提高代码的重用率。本练习案例将深入探讨多态的常见...

    Java多态的实现机制

    你可以通过指定一种类型以重用这个抽象类。 例子: ```java List&lt;String&gt; list = new ArrayList(); list.add("hello"); list.add("world"); ``` 在上面的例子中,List 抽象类可以抽象成不同的类型,如 String、...

    java多态的总结

    在Java中,多态分为编译时多态和运行时多态。编译时多态主要体现在方法的重载(Overloading),即在同一个类中可以有多个同名方法,但参数列表不同。编译器会根据传入参数的类型和数量来决定调用哪个方法。运行时...

    Java多态的讲解

    Java多态的讲解

    原来多态还可以这样

    这主要体现在两个方面:静态多态(编译时多态)和动态多态(运行时多态)。静态多态通常通过函数重载或运算符重载实现,而动态多态则依赖于接口、继承和虚函数等机制。 1. 静态多态:在编译期间就能确定调用哪个...

    基于C++的多态模式编写类的代码多态.docx

    在C++中,多态(Polymorphism)是面向对象编程的一个核心概念,它允许我们使用一个接口来表示多种不同的类型。多态性使得代码更加灵活,可扩展性更强,可以减少代码重复,并提高代码的复用性。在这个文档中,通过两...

    面向对象 多态 教程 你分得清 隐藏, 重置, 重载, 甚至还有重写 吗.zip

    在面向对象的世界里,多态性(Polymorphism)是三大基础特性(封装、继承、多态)之一,是实现灵活性和可扩展性的关键。多态允许我们使用一个通用的接口来处理不同的数据类型或行为,极大地提高了代码的复用性和可...

    多态PPT文件!!!!

    在IT行业中,多态(Polymorphism)是一个核心概念,主要在面向对象编程(Object-Oriented Programming, OOP)中出现。它允许我们使用一个接口来表示多种不同的类型,从而提高了代码的灵活性、可扩展性和可重用性。在...

    Animal(多态练习)

    在IT行业中,面向对象编程(OOP)是一种广泛使用的编程范式,它允许我们通过类和对象来...通过对压缩包中的文件进行学习和实践,你将能够更好地掌握C++中的多态机制和设计模式的应用,为今后的项目开发打下坚实的基础。

    封装继承多态总结

    封装继承多态总结

    java 多态 经典讲解

    ### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...

    java中多态实现

    java多态实现的课件,给那些需要的人 讲述了java多态的概念、分类、实现 综合案例讲解、总结多态的作用

Global site tag (gtag.js) - Google Analytics