当前位置: 代码迷 >> C# >> 对于C#中多态的疑点
  详细解决方案

对于C#中多态的疑点

热度:16   发布时间:2016-05-05 03:20:43.0
对于C#中多态的疑问?
class A
{
public string Str = "A";

public void Show() { Console.WriteLine("Show A"); }
}

class B : A
{
public string Str = "B";

public virtual void Show() { Console.WriteLine("Show B"); }
}

class C : B
{
public override void Show() { Console.WriteLine("Show C"); }
}
class Program
{
static void Main(string[] args)
{
A a=new C();
               a.show();
              Console.ReadLine();
}
}


//////////得出的结果怎么是
Show A?????


------解决思路----------------------
A.Show没有标记为virtual,编译器会认为A.Show和B.Show除了名称和参数相同以外没有什么关系,所以A和B不存在重载的情况。那么到底是调用了哪个Show方法,还是要看类型申明成了什么,你的代码里声明成了A,尽管是实例化成了C,但还是调用了A的Show方法。
------解决思路----------------------
引用:
Quote: 引用:

楼主先把virtual 和override?的含义弄明白了,就自然知道到底有啥区别了


virtual:虚方法
override:重载

如果没加new的话,默认就是new 吧



对于现在你来说可能只是知道这个修饰是什么,但是还没理解(而且overrd还不是重载,重载和重写不同)。
对于虚方法,如果子类没有重写,就默认使用基类的方法,如果重写就是用子类方法。
至于你属的new和这个没关系。基类不是虚方法的也可以new,不过new的概念和你这个例子没什么关系了。





------解决思路----------------------
然我们来看看写 class B 的这位同学的心里活动:”首先,我先看看class A有没有什么定义为public的但是没有写virtual的方法,找到了!是Show方法,它是public的(暴露接口方法、将来被人在多态应用中会被调用)并且没有 virtual。然后,呵呵,突出我会c#编程语法的机会到了,我故意弄一个同名的Show方法并且写上virtual,将来遇到 lz 这类多态运行时错误时,我就在同学们和老师面前成功地成为麻烦焦点而又能狡辩一堆c#语法了”。

这在我的开发工程过程中是禁止的。因为这种程序设计思路是糟粕。
  相关解决方案