繁体   English   中英

在创建派生类的新对象时使用基类的构造函数?

[英]Using the constructor of the base class when creating new object of derived class?

    Public class A
    {
    ...
    }
    Public class B:A
    {
    ...
    }
    Public class Prog
    {
    public static void Main()
    {
         A myA = new B();
    }
}

如果myA是A类的实例,那么为什么使用B构造函数,以及与此有何不同:

A myA = new A();

这段代码也可能更接近这个问题: 在此处输入图片说明

我知道这可能是一个非常基本的问题,但我真的很困惑。

仅当您想要继承AB实例时,才不必使用B构造函数。

您还可以设置B以便为您调用A的构造函数,例如:

public class A
{
    public A()
    {
    }
}

public class B : A
{
    public B() : base()
    {
    }
}

这完全取决于AB类的实现以及要使用它们的目的。

编辑:

根据您的图像,您之所以像Vehicle c = new Car()那样调用,是因为您实际创建的对象是Car但是您仍然希望或需要使用基类的各个方面。 拥有此基类意味着您可以在实现类之间具有公共属性。

例如:

public class Vehicle
{
    public Vehicle()
    {
    }

    public int NumberOfWheels { get; set; }
}

public class Car : Vehicle
{
    public Car() : base()
    {
        NumberOfWheels = 4;
    }
}

public class Motorbike : Vehicle
{
    public Motorbike() : base()
    {
        NumberOfWheels = 2;
    }
}

这种情况只允许您一次定义NumberOfWheels ,并且只为您正在编写的实现设置适当的值。 您可以使用virtual方法对方法执行相同的操作。

A myA = new B();

这将创建类型B的对象。 没有创建类型A的对象。 但是 ,您铸造的对象A 本质上来说,使用非常规术语进行转换意味着您说的是'将其视为A查看该对象。 忽略它可能是B的事实。 只向我展示在A )类中定义的方法和属性。

请注意,您可以将其重新投射回B ,这不会改变对象:

B myB = (B)myA;

两者之间的区别:

A myA = new A();

和这个:

A myA = new B();

是第一个语句正在创建类型A的物理对象。 B定义的任何替代或新方法/属性/字段都不会创建 第二条语句将创建类型的物理对象B ,但是,以查看它(甚至暂时地)作为A

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM