C#多态小结——面向对象编程的三大机制之二

C#的多态性:

我的理解是:同一个操作,作用于不同的对象时,会有不同的结果,即同一个方法根据需要,作用于不同的对象时,会有不同的实现。

C#的多态包括:接口多态,继承多态。

其中继承多态又包括通过虚拟方法实现的多态和通过抽象方法实现的多态性

例如:基类动物都有吃的方法,但是不同的动物吃的东西就会不一样,例如狼吃肉,羊吃草,这样“吃”的这个方法就要在派生类里面重新实现以下,运行时,通过指向基类的指针,来调用实现派生类中的方法。

接下来举例实现多态性。

1. 接口多态性

把动物“吃”的方法放到一个接口(IAnimal)里,然后让具体的动物类(Wolf/Sheep)继承这个接口,并根据自己的需要实现这个接口。

代码实现:

class Program {static void Main(string[] args) {new Wolf().Eat();new Sheep().Eat();
}
}

public class Wolf : IAnimal {//多态实现        public void Eat() {
Console.WriteLine("狼吃肉!");
}
}

public class Sheep : IAnimal {//多态实现        public void Eat() {
Console.WriteLine("羊吃草!");
}
}

//接口    public interface IAnimal {void Eat();
}

接口的多态性就是当不同的类继承了相同的接口以后,都要根据自己的需要重新实现继承的接口,这样同样的方法签名在不同的类中就会实现不同的操作。

2. 继承的多态性

2.1.通过虚拟方法实现的多态(virtual,override)

   首先要在基类中实现virtual方法,然后在派生类中根据自己的需要用override重写virtual方法。如果不希望这个方法被继续重写,则把这个方法写成sealed方法。

  virtual方法必须在基类中实现。

  代码实现:

class Program {static void Main(string[] args) {new Wolf().Eat();new Sheep().Eat();new Goat().Eat();
}
}

public class Wolf : Animal {//多态实现        public override void Eat() {base.Eat();
Console.WriteLine("狼吃肉!");
}
}

public class Sheep : Animal {//多态实现        public override void Eat() {base.Eat();
Console.WriteLine("羊吃草!");
}
}

public class Goat : Sheep {//多态实现被终结,此Eat方法不能被override,因为用sealed了        public sealed override void Eat() {//base.Eat();            Console.WriteLine("山羊吃草!");
}
}

//基类实现虚方法    public class Animal {public virtual void Eat() { }
}

2.2.通过抽象方法实现的多态(abstract,override)

抽象方法必须定义在抽象类里。抽象类不能被创建实例。

基类中的抽象方法只能被声明,不需要实现,所以派生类中重写抽象方法的时候没有base方法。

代码实现如下:

class Program {static void Main(string[] args) {new Wolf().Eat();new Sheep().Eat();new Goat().Eat();
}
}

public class Wolf : Animal {//多态实现        public override void Eat() {
Console.WriteLine("狼吃肉!");
}
}

public class Sheep : Animal {//多态实现        public override void Eat() {
Console.WriteLine("羊吃草!");
}
}

public class Goat : Sheep {//多态实现被终结,此Eat方法不能被override,因为用sealed了        public sealed override void Eat() {
Console.WriteLine("山羊吃草!");
}
}

//基类只需声明方法    public abstract class Animal {public abstract void Eat();
}

总结:

1.虚方法重写的时候可以有base方法(base.Eat()),抽象方法重写的时候没有base方法,原因是:虚方法必须在基类中实现,抽象方法只在基类中声明,不需要实现。

2.派生类中可以 不重写虚方法的实现,但是派生类必须重写抽象方法的实现,原因同1.

3.包含虚方法的非抽象类可以被创建实例(对象),但是包含抽象方法的抽象类不能被创建实例。

4.继承接口的派生类必须实现接口的方法,因为接口也是只负责声明方法,不负责实现。

5.接口的多态性不需要用override重写方法。

 

作者:绿茶叶 
出处:http://www.cnblogs.com/greenteaone/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/greenteaone/archive/2012/01/16/2320841.html

时间: 2024-11-28 20:45:42

C#多态小结——面向对象编程的三大机制之二的相关文章

C#继承小结——面向对象编程的三大机制之一

继承反应了类和类之间的关系.     世界上很多事物都是有共性的,共性的那一部分我们就抽象为基类,用于派生其它类,这样提高了代码的复用性,使得代码的结构清晰易读,而且易于代码的扩展和维护.      C#的继承只能继承自一个基类,这一点不同于C++的继承.     C#的继承具有传递性,即B继承自A,C继承自B,则C具有A的所有特性.     C#的继承隐式为public的.     假如不在派生类构造器中显示调用一个基类构造器,编译器会自动插入对基类的默认构造器的一个调用,然后才会执行派生类构

Python面向对象编程 - 一个记事本程序范例(二)

给程序加上控制台菜单 menu.py import sys from notebook import Notebook, Note class Menu: '''Display a menu and respond to choices when run.''' def __init__(self): self.notebook = Notebook() self.choices = { "1": self.show_all_notes, "2": self.sea

简明Python教程学习笔记_6_面向对象编程

简介 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象这个类的 实例 .这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象). 类(Class)::用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 对象:          通过类定义的数据结构实例.对象包括两个数据成员(类变量和实例变量)和方法. 实例化:      创建一个类的实例,类的具体对象.方法:          类中定义的函数. (方法和函数在

PHP面向对象编程详解:类和对象

PHP面向对象编程详解:类和对象 从OOP的视角看,不应区分语言.无论是C++.无论是Java.无论是.net还有更多面向对象的语言,只要你了解了OO的真谛,便可以跨越语言,让你的思想轻松的跳跃.便没有对于Java..net.PHP 之间谁强谁弱的争执了. 希望这个介绍PHP5面向对象编程(OOP)的资料能让初学者受益,能让更多的PHPer开始转向OO的编程过程. 相对PHP4,PHP5在面向对象方面改变了很多.我们将只介绍PHP5环境下的面向对象.而我们必须改变自己来跟随PHP5的发展.如果代

013_《Delphi面向对象编程思想》

<Delphi面向对象编程思想> Delphi 教程 系列书籍 (013) <Delphi面向对象编程思想> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 作者: 刘艺 [作译者介绍] 丛书名: Borland核心技术丛书 出版社:机械工业出版社 ISBN:7111127722 上架时间:2003-10-10 出版日期:2003 年9月 开本:16开 页码:476 版次:1-1 内容简介 这是一本纯粹讨论dlephi面向对象编程的力作. 本书以精

多态-link和面向对象编程的取舍?现在不是提倡面向对象编程了么?那么用了link

问题描述 link和面向对象编程的取舍?现在不是提倡面向对象编程了么?那么用了link link和面向对象编程的取舍?现在不是提倡面向对象编程了么?那么用了link,查询变成过程化了,怎么体现多态呢? 解决方案 正因为面向对象,所以有了ORM,而linq非常适合ORM的框架,因为它可以以对象的方式而不是数据库表结构实现查询.至于多态,不知道你在说什么.

javascript 面向对象编程基础 多态_js面向对象

Javascript已经可以模拟出面向对象的封装和继承特性,但是不幸的是Javascript对多态特性的支持非常弱!其它面向对象语言的多态一般都由方法重载和虚方法来实现多态,Javascript也通过这两种途径来实现! 重载:由于Javascript是弱类型的语言,而且又支持可变参数,当我们定义重载方法的时候,解释器无法通过参数类型和参数个数来区分不同的重载方法,因此方法重载是不被支持的!当先后定义了同名的方法的时候,后定义的方法会覆盖先定义的方法! 既然解释器无法分辨重载方法,那就手动区分不同

每天一篇javascript学习小结(面向对象编程)_javascript技巧

1.面向对象的工厂方法 function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); }; return o; } var person1 = createPerson("Nicholas", 29, "Software Engineer");

简明Python3教程 13.面向对象编程

简介 (注: OOP代表面向对象编程,OO代表面向对象,以后全部使用英文缩写) 迄今为止我们编写的所有程序都是围绕函数创建的,函数即操纵数据的语句块.这称作面向过程编程. 除此之外还有另一种组织程序的方法,将数据与功能组合到一起封装进被称为对象的东西中.这叫做OOP. 大多数时候你可以使用过程性编程,但当编写大型程序或问题更倾向以OO方式解决时,你还可以使用OOP技术. 类和对象是OOP的两个重要特征.类用于创建新的类型,而对象是类的实例.这就象你创建int类型的变量,这些变量就是int类的实例