2012-10-06 37 views
1
public class Father 
{ 
    // static string TYPE = "FATHER"; 
    public Father() 
    { 
     //Console.WriteLine("ctor"); 
    } 
    public virtual void Print() 
    { 
     Console.WriteLine("I'm father"); 
    } 
} 

public class Son:Father 
{ 
    public override void Print() 
    { 
     base.Print(); 
     Console.WriteLine("I'm son"); 
    } 
} 

正如我们知道,如果我们调用Son.Print(),它会打印出“我是父亲”和“我是儿子”.And Father.Print()是一个实例方法,我们需要先创建一个实例。所以这就是问题,谁创建它?显然,不是我... 或子拥有两个打印methodtable.One方法可以访问父亲,anthor可以自己访问? 哪一个是对的?或者都不对?请告诉我!谢谢!关于.Net继承的问题

+3

小问候,但儿子:父亲在OOP意义上是一个非常糟糕的继承例子 –

+0

如果您将Son类作为子类型访问,那么您将获得父类和子类数据和行为。 –

+0

事实上,这个例子本身可能是造成混淆的原因,而不是一般的继承。 “儿子”正在印刷这两种说法,因为在这种情况下,“儿子”就是“父亲”。虽然这对于一部分人群来说是正确的,但这种继承层次所暗示的并不是普遍的正确。 “儿子”和“父亲”应该是接口,而不是继承类。每个Person实体都应该实现适当的接口。这是如何不使用继承的一个很好的例子。 (虽然我确信这里有一个很好的“继承”玩笑,在这里关于父亲和儿子...) – David

回答

4

谁创建它?显然不是我

是什么让你如此肯定?当然,你做的事:

Son s = new Son(); 

或者Son拥有该方法表2种Print方法。

不,它只有一个Print方法,但它有别的东西:它知道它的基类,Father,它有自己的Print方法。这就是为什么Son有权访问两个Print - 它自己的和他的Father的。

+1

也要澄清。当你不在构造函数后面放置任何东西时,会在其末尾添加一个隐含的':base()'。所以'Son'调用'Father'的无参数构造函数,'Father'调用'object'的无参数构造函数(因为如果不指定父类,则添加隐式':object'到你的班级定义)。 –

+0

谢谢!我知道当我们调用Son的构造函数时,它也调用它的基类的构造函数。但是谁拥有它的基本引用或谁存储了引用,关键字base(对不起,这是错误的,但我不知道如何解释...)? –

+0

没有提及基地,只有*关于基地的知识。这种神秘的“知识”通常以对基类的虚拟表格的引用的形式出现,但标准并没有说它必定是那种方式。 – dasblinkenlight