Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于.Net继承的问题_C#_.net - Fatal编程技术网

C# 关于.Net继承的问题

C# 关于.Net继承的问题,c#,.net,C#,.net,正如我们所知,如果我们调用Son.Print(),它将打印出“我是父亲”和“我是儿子”。而父亲.Print()是一个实例方法,我们需要先创建一个实例。所以这就是问题,谁创建了它?显然,不是我。。。 或者Son在methodtable中拥有两个打印方法,其中一个可以由父访问,另一个可以自己访问? 哪一个是对的?或者两者都不对?请告诉我!谢谢 谁创造了它?显然不是我 你凭什么这么肯定?你当然会: public class Father { // static string TYPE = "FAT

正如我们所知,如果我们调用Son.Print(),它将打印出“我是父亲”和“我是儿子”。而父亲.Print()是一个实例方法,我们需要先创建一个实例。所以这就是问题,谁创建了它?显然,不是我。。。 或者Son在methodtable中拥有两个打印方法,其中一个可以由父访问,另一个可以自己访问? 哪一个是对的?或者两者都不对?请告诉我!谢谢

谁创造了它?显然不是我

你凭什么这么肯定?你当然会:

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
在methodtable中拥有两个
Print
方法

不,它只有一个
Print
方法,但它还有别的东西:它知道它的基类
Father
,它有自己的
Print
方法。这就是为什么
儿子
可以访问两个
打印文件
的原因-他自己的和他父亲的

谁创造了它?显然不是我

你凭什么这么肯定?你当然会:

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
在methodtable中拥有两个
Print
方法


不,它只有一个
Print
方法,但它还有别的东西:它知道它的基类
Father
,它有自己的
Print
方法。这就是为什么
儿子
有权获得两份
印刷品
的原因——他自己的和他的
父亲的。

同样需要澄清。如果不在构造函数后面放置任何内容,则会在构造函数末尾添加一个隐式的
:base()
。因此,
Son
正在调用
Father
的无参数构造函数,
Father
正在调用
object
的无参数构造函数(因为如果您不指定父类,隐式的
:object
将添加到您的类定义中)。谢谢!我知道当我们调用Son的构造函数时,它也会调用其基的构造函数。但是谁拥有其基的引用,谁存储引用,关键字base(对不起,这是错误的,但我不知道如何解释…)?没有对基的引用,只有关于基的知识。这种神秘的“知识”通常以引用基类的虚拟表的形式出现,但标准没有规定必须是这样。我很困惑……“没有对基类的引用”,但我们如何才能调用它的实例方法?@LyonGu调用实例方法需要两件事——对对象的引用,和指向该方法的指针。由于继承的实现方式,您可以将派生类型的引用从基类传递给方法。这就是为什么不需要引用基:引用
this
就足够了。这也是为了澄清。如果不在构造函数后面放置任何内容,则会在构造函数末尾添加一个隐式的
:base()
。因此,
Son
正在调用
Father
的无参数构造函数,
Father
正在调用
object
的无参数构造函数(因为如果您不指定父类,隐式的
:object
将添加到您的类定义中)。谢谢!我知道当我们调用Son的构造函数时,它也会调用其基的构造函数。但是谁拥有其基的引用,谁存储引用,关键字base(对不起,这是错误的,但我不知道如何解释…)?没有对基的引用,只有关于基的知识。这种神秘的“知识”通常以引用基类的虚拟表的形式出现,但标准没有规定必须是这样。我很困惑……“没有对基类的引用”,但我们如何才能调用它的实例方法?@LyonGu调用实例方法需要两件事——对对象的引用,和指向该方法的指针。由于继承的实现方式,您可以将派生类型的引用从基类传递给方法。这就是为什么对基的引用是不必要的:对
this
的引用就足够了。虽然有点小吹毛求疵,但从面向对象的意义上来说,父继承是一个非常糟糕的例子。如果您将类子作为子类型访问,则会同时获得类父和类子的数据和行为。事实上,这个例子本身可能是造成混乱的原因,而不是一般意义上的继承
Son
正在打印这两条语句,因为在本例中,
Son
是一个
父亲。虽然这对一部分人群来说是正确的,但它肯定不是像这个继承层次结构所暗示的那样普遍正确<代码>子
和父
应该是接口,而不是继承类。每个
实体应实现适当的接口。这是如何不使用继承的一个很好的例子。(虽然我肯定这里有一个关于父子的好“继承”笑话…)我总是使用
形状
正方形
,和
三角形
,因为每个人都能理解正方形是形状,三角形是形状,但三角形和正方形是不同的东西。小的诡辩,但是,从面向对象的角度来看,父继承是一个非常糟糕的继承示例。如果您将类子作为子类型访问,则会同时获得类父和类子的数据和行为。事实上,示例本身可能是导致混淆的原因,而不是一般的继承
Son
正在打印这两条语句,因为在本例中,
Son
是一个
父亲。虽然这对一部分人群来说是正确的,但它肯定不是像这个继承层次结构所暗示的那样普遍正确<代码>子
和父应该是接口,而不是继承类。每个
实体应实现适当的接口。这是如何不使用继承的一个很好的例子。(虽然我肯定这里有一个关于父子的好“继承”笑话…)我总是使用
形状
正方形
,和
三角形
,因为每个人都知道正方形是形状