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();
我知道这可能是一个非常基本的问题,但我真的很困惑。
答案 0 :(得分:0)
只有当您希望B
的实例继承B
时,您才必须使用A
构造函数。
您还可以设置B
,以便为您调用A
的构造函数,例如:
public class A
{
public A()
{
}
}
public class B : A
{
public B() : base()
{
}
}
这一切完全取决于您的A
和B
类的实施以及您希望将它们用于哪些类。
编辑:
根据您的图像,您调用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