创建子类的实例是否会创建父类的实例?

brk*_*brk 26 .net c#

我是C#的新手,我想知道,如果我创建一个子类的实例,它是否也会自动创建父类的实例或者什么?

这是我的代码:

class Program
{

    public class ParentClass
    {
        public ParentClass()
        {
            Console.WriteLine("ChildClass uses my Ctor ");
        }

    }

    public class ChildClass : ParentClass
    {
        public ChildClass()
        {
            Console.WriteLine("SaySomething");
        }
    }

    public static void Main()
    {
        ChildClass child = new ChildClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 64

它是否也会自动创建Parent类的实例?

不是一个单独的实例; 在讨论继承时,这ChildClass 一个ParentClass实例.

用语言来说,这就像:

在创建狗时,我们还创建了一个动物实例吗?

我们不制造狗(分开)制造动物; 狗动物的例子.如果我们制作一只贵宾犬,贵宾犬就是狗,就是动物.

  • 真实的比喻:如果你买了一只狗,你还买了一只动物吗?是的,但不是一个完整的独立动物. (12认同)
  • @brk很好......既然也没有; 如果我们创建一个类型为`Dog`的实例,并询问它是什么(`GetType()`):它会说`Dog`; 然而,所有'狗`*都是*动物,所以说'dogInstance是动物'是真的.我们还没有创建一个只知道`Animal`*的`new Animal()`实例*.事实上,`Animal`可能是`abstract`(也许应该是) (4认同)
  • 用另一种方式表达它:它没有被实现,好像`Dog`实例有一个私有字段是`Animal _baseTypeInstance;` - 这里只有**一个`object`,就其而言关注:它是一只"狗" (3认同)

And*_*Gis 9

不,它没有,但它调用基础构造函数(父类的构造函数).在您的情况下,这是空的,因此编译器会为您完成对基类构造函数的调用:

class Program
{
    public class ParentClass
    {
        public ParentClass()
        {
            Console.WriteLine("ChildClass drived from me ");
        }

    }

    public class ChildClass : ParentClass
    {
        public ChildClass() : base() // base() call is voluntary
        {
            Console.WriteLine("This also use my Ctor");
        }
    }

    public static void Main()
    {
        ChildClass child = new ChildClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您的基类没有无参数构造函数,则必须调用它

class Program
{
    public class ParentClass
    {
        public ParentClass(string foo)
        {
            Console.WriteLine("ChildClass drived from me ");
        }

    }

    public class ChildClass : ParentClass
    {
        public ChildClass() : base("some foo") // base call is obligatory
        {
            Console.WriteLine("This also use my Ctor");
        }
    }

    public static void Main()
    {
        ChildClass child = new ChildClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

根据定义,当ChildClass继承形式时ParentClass,ChildClass对象也属于它ParentClass.

如果您的命名更加真实,那么它将更容易理解.

class Animal {}
class Cat : Animal {}

var rocky = new Cat();
Run Code Online (Sandbox Code Playgroud)

看,岩石一只猫,但它也是一种动物.

  • @brk因为不是每只动物都是狗:).代码中的"dog"变量**是Animal类型的**.目前你已经分配了一只狗.但你也可以分配一只猫(`dog = new Cat()`).因此编译器不会让你将"dog"(Aminal)分配给Dog类.除非你施放它(`狗ricky =(狗)狗) - 这样你告诉编译器你知道你在做什么,而且你不会意外地将猫分配给狗.但是,如果"dog"不是Dog,您将获得InvalidCastException. (3认同)

May*_*zer 8

你问题的实际答案是

'不',它是Child类的实例,而不是Parent的实例.

但是如果你的问题是:"你是否有一个包含Parent类的所有属性的实例对象",答案是

'是',您将父类中的所有属性和字段都复制到Child实例中.