作者ssccg (23)
看板C_Sharp
标题Re: [问题] 继承与虚拟方法的问题
时间Wed Nov 24 11:28:50 2010
※ 引述《AJE (小杰)》之铭言:
: 想请问有关继承与覆写虚拟函数的问题
: 以下是我写的测试程式:
(略)
: //Class宣告--------------------------------------
: //主程式
: Child Val = new Child();
: MessageBox.Show(Convert.ToString(Val.CalcVal()));
: 因为CalcVal是父类别的函式,而父类别也有自己的Data()函式,
: 所以我本来以为输出的值是10,但是实际输出的结果是200,
: 我想请问:
: 1.是不是只要被覆写之後,父类别中呼叫被覆写的函式时,实际上会
: 呼叫到子类别中的函式?
应该说如果呼叫一个标记为virtual的函式时
会看呼叫那个函式的物件实际的类别是哪一个
如果该类别有override的版本则呼叫该类别的版本
以你的测试程式为例
// 实际物件是Child,结果是200
Father Val = new Child();
MessageBox.Show(Val.CalcVal().ToString());
// 实际物件是Father,结果是10
Father Val = new Father();
MessageBox.Show(Val.CalcVal().ToString());
: 2.如果是的话,那麽在父类别中的任何函式,实作上是否最好不要呼叫
: 任何一个"虚拟"函式,以免未预期的行为发生?
要看你预期的行为到底是什麽
如果你不希望一个函式被继承之後可能会被改掉
就不应该标记成virtual
: 3.在这个例子中,如果我希望输出10,且又希望两个类别保有Data()函式的话,
: 是不是最好用独立的两个类别来处理,不要用"继承"的方式?
你可以不要用virtual-override的方式
Child类别里用 new public int Data()
Father类别的Data()就不会被改掉
而是在以Child类别的reference存取时会被隐藏
但用Father类别的reference呼叫或是在Father中呼叫都会取Father版的Data()
: 先谢谢版友了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.114.194.108
※ 编辑: ssccg 来自: 58.114.194.108 (11/24 11:30)
1F:推 AJE:感谢 又学了一些 11/24 18:00