作者Deadshot465 (十三)
看板C_Sharp
标题Re: [问题] 继承与虚拟方法的问题
时间Wed Nov 24 12:04:01 2010
※ 引述《ssccg (23)》之铭言:
: 你可以不要用virtual-override的方式
: Child类别里用 new public int Data()
: Father类别的Data()就不会被改掉
: 而是在以Child类别的reference存取时会被隐藏
: 但用Father类别的reference呼叫或是在Father中呼叫都会取Father版的Data()
补充一下ssccg大这个部分
new跟override最明显的一个差异在
假设将Father类别改写成这样:
class Father
{
public virtual int Data() { return 10; }
//新增一个virtual方法
public virtual string Name() { return "I'm father."; }
}
并把Child类别改写成这样:
class Child : Father
{
//Data方法使用Override
public override int Data() { return 200; }
//Name方法使用New
public new string Name() { return "I'm child."; }
}
则在Main()当中撰写以下程式码:
Father father = new Father();
Console.WriteLine(father.Data()); //如ssccg大说的,会印出10
Console.WriteLine(father.Name()); //I'm father.
Child child = new Child();
Console.WriteLine(child.Data()); //Data()方法已被override,印出200
//即使upcast成Father,仍会印出200,这是override的效果
Console.WriteLine(((Father)child).Data()); //200
Console.WriteLine(child.Name()); //I'm child.
//因为使用new只是隐藏了父类别的方法,所以当upcast成Father时,
//会使用Father的方法
Console.WriteLine(((Father)child).Name()); //I'm father.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.156.239
※ 编辑: Deadshot465 来自: 140.119.156.239 (11/24 12:04)
1F:→ ashram:受教了 11/24 14:13
2F:→ AJE:感谢 又学了一些 (抱歉 推文时间还没过) 11/24 18:01
3F:推 popmentos:原来是这样 谢谢 11/24 21:17
※ 编辑: Deadshot465 来自: 140.119.156.239 (11/24 21:37)