class Animal
{
public Animal()
{
Console.WriteLine("Animal constructor");
}
public void Greet()
{
Console.WriteLine("Animal says Hello");
}
public void Talk()
{
Console.WriteLine("Animal talk");
}
public virtual void Sing()
{
Console.WriteLine("Animal song");
}
};
class Dog : Animal
{
public Dog()
{
Console.WriteLine("Dog constructor");
}
public new void Talk()
{
Console.WriteLine("Dog talk");
}
public override void Sing()
{
Console.WriteLine("Dog song");
}
};
Animal a2 = new Dog();
a2.Talk();//这一步为什么访问的是父类的方法?不是说关注对象吗?
a2.Sing();
a2.Greet();
{
public Animal()
{
Console.WriteLine("Animal constructor");
}
public void Greet()
{
Console.WriteLine("Animal says Hello");
}
public void Talk()
{
Console.WriteLine("Animal talk");
}
public virtual void Sing()
{
Console.WriteLine("Animal song");
}
};
class Dog : Animal
{
public Dog()
{
Console.WriteLine("Dog constructor");
}
public new void Talk()
{
Console.WriteLine("Dog talk");
}
public override void Sing()
{
Console.WriteLine("Dog song");
}
};
Animal a2 = new Dog();
a2.Talk();//这一步为什么访问的是父类的方法?不是说关注对象吗?
a2.Sing();
a2.Greet();
解决方案 »
- 如何使用wmi来实现远程对服务器上文件夹和文件的操作
- C#如何获取用户当前电脑屏幕大小?比如1024*768,如何获得?
- 怎样在控件外点击时隐藏这个控件、点击下拉列表按钮时不出现下拉列表
- 我想要.net Framework 2.0 SDK文档,谁提供一份给我?谢谢!
- 100分求救 关于 用 c# 导入导出问题
- 关于添加COM引用的问题
- 窗体最小化以后,如果有新消息,怎样让它在任务栏上闪烁提示呢?
- 如何获取datagrid第一个单元格的值?(在线等,急啊)
- C#使用System.Data.SQLite.dll 报错
- c#与java的连接
- 本人菜鸟,请问窗体线程如何延时执行代码,但保持窗体不挂起
- 在vs2005中怎么exe还是dll输出?
系统内部函数调用都是用指针实现的,这个引用对于子类没有覆盖的父类方法还是调用父类的,覆盖后指针调用子类方法。
多态性其实是程序运行时指针实现的。
派生类前面加override关键字进行重写的
才有多态
不加override关键字,会默认为加了new关键字,隐藏基类中的方法,不会有多态
数据可以在每个对象中有一份copy,
而方法在代码区而不是数据区,只与类型有关,只有一份全局copy
类型是父类 访问的当然是父类的方法
==
因为你这个方法不是虚方法,只有虚方法或抽象方法会实现多态
{ public abstract void ShowType(); public void Eat()
{ Console.WriteLine("Animal always eat."); }}public class Bird : Animal
{ private string type = "Bird"; public override void ShowType()
{ Console.WriteLine("Type is {0}", type); } private string color; public string Color
{ get { return color; } set { color = value; } }}public class Chicken : Bird
{ private string type = "Chicken"; public override void ShowType()
{ Console.WriteLine("Type is {0}", type); } public void ShowColor()
{ Console.WriteLine("Color is {0}", Color); }} Bird bird2 = new Chicken();
bird2.ShowType();那你们说这个应该显示什么?
注意:你这个例子是因为代码是你从头到尾自己写的,所以你认为所有东西你都关注并实现了
可是如果上面那些类Chicken,Bird,Animal 都不是你写的而是别人提供的。那么你作为调用者,你认为你关注了些啥呢? Bird bird2 = new Chicken();
bird2.ShowType(); 看见了吗?你并没有关注Chicken的具体实现,但你同样取得了Chicken的方法。明白没有!这里的一些都是对调用者说的,多态是对调用者来说ShowType()这个方法会根据new的对象不同而有不同的执行结果。
给个例子给你 现在有一个函数 飞()
他的形式是:void 飞(鸟 obj)
{
obj.飞()
}这样对于调用者来说,他的调用方式是
飞(new 麻雀());
飞(new 鸡());ok,这样的方式是简单的,而且只要他是继承鸟类,麻雀也好,鸡也好,老鹰也好,你都可以使用飞这个函数。如果你不用多态,你会如何写这个飞的函数???void 飞(鸡 obj)
void 飞(麻雀 obj)
void 飞(老鹰 obj)!!!!!!!!!!!!!!!!!很明显,后面一种方式无疑是一件很麻烦的形式,而且他直接依赖于你是否实现了 飞(某种鸟类 obj)这个函数