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

时间:2016-01-17 23:45:56

标签: c# oop inheritance

    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();

此代码也可能更接近此问题: enter image description here

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

2 个答案:

答案 0 :(得分:0)

只有当您希望B的实例继承B时,您才必须使用A构造函数。

您还可以设置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方法对方法执行相同的操作。

答案 1 :(得分:0)

A myA = new B();

这是创建B类型的对象。 创建A类型的对象。 但是,您casting的对象是A。在layterms中进行投射本质上意味着你正在说这个对象就好像它是A一样。忽略它可能是B的事实。仅显示类A中定义的方法和属性。

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

B myB = (B)myA;

这之间的区别:

A myA = new A();

和此:

A myA = new B();

第一个声明是创建A类型的物理对象吗?将不会创建B 中定义的任何覆盖或新方法/属性/字段。第二个语句将创建一个B类型的物理对象,但查看它(甚至暂时)为A