C# 多态例子【原创】

//多态的例子
using System;
using System.Collections.Generic;
using System.Text;

namespace PolymorphisnTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
"老总讲话:大家请肃静,现在刚好08:00整,我们开始开会,请各个部门领导发言:");
//定义存放Company类型的实力
Company[] CArray = new Company[3];
CArray[
0] = new Manager();
CArray[
0].Say("张经理:");
CArray[
0].Foo();
CArray[
1] = new Coder();
CArray[
1].Say("李程序员:");
CArray[
1].Foo();
CArray[
2] = new Accountant();
CArray[
2].Say("钱会计:");
CArray[
2].Foo();
Console.ReadKey();
}
}
// 定义个公司类
class Company
{
string Name = "";
public virtual void Say(string name)
{
this.Name = name;
}
public virtual void Foo()
{
Console.WriteLine(Name
+" 公司条例规定,不同岗位的工作人员,干好本职工作!");
}
}
//定义个经理类
class Manager:Company
{
string Name = "";
public override void Say(string name)
{
//base.Say(name);
this.Name = name;
}
public override void Foo()
{
Console.WriteLine(Name
+" 开早会,给大家分配工作");
}
}
//定义程序员类
class Coder:Company
{
string Name = "";
public override void Say(string name)
{
//base.Say(name);
this.Name = name;
}
public override void Foo()
{
Console.WriteLine(Name
+" 根据经理早会的内容,我开始编写代码了");
}
}
//定义财会类
class Accountant:Company
{
string Name = "";
public override void Say(string name)
{
//base.Say(name);
this.Name = name;
}
public override void Foo()
{
Console.WriteLine(Name
+" 今天早会提到员工工资的事情了。而今天刚好是开工资的日子,我必须抓紧发工资,让员工好好干活!");
}
}

}

下边内容【转载】

多态 - 定义

多态(Polymorphisn)?按字面的意思就是“多种形状”。我手头的上没有找到一个多态的理论性的概念的描述。暂且引用一下Charlie Calverts的对多态的描述吧——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function)实现的。

多态 - “虚函数”(或者是“虚方法”)

虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”(override),或者称为“重写”。

多态 - 多态的作用

把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。   赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。   举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。   比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以附给其基类的对象,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。   使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象 当作基类的的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适 应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。   简单的说,建立一个父类的变量,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个变量调用这个函数的时候,定义这个变量的类,也就是父类,里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用.

原文地址:https://www.cnblogs.com/beeone/p/2100737.html