C# 在创建派生类的新对象时使用基类的构造函数?
如果myA是一个类的实例,为什么我使用B构造函数,以及它与此的区别:C# 在创建派生类的新对象时使用基类的构造函数?,c#,oop,inheritance,C#,Oop,Inheritance,如果myA是一个类的实例,为什么我使用B构造函数,以及它与此的区别: Public class A { ... } Public class B:A { ... } Public class Prog { public static void Main() { A myA = new B(); } } 此外,此代码可能更接近此问题: 我知道这可能是一个非常基本的问题,但我
Public class A
{
...
}
Public class B:A
{
...
}
Public class Prog
{
public static void Main()
{
A myA = new B();
}
}
此外,此代码可能更接近此问题:
我知道这可能是一个非常基本的问题,但我真的很困惑。您不必使用
B
构造函数,只要您想要继承A
的B
实例
您还可以设置B
,以便为您调用A
的构造函数,例如:
A myA = new A();
这完全取决于A
和B
类的实现以及它们的用途
编辑:
根据您的图像,您之所以调用likeVehicle c=new Car()
,是因为您实际创建的对象是Car
,但您仍然希望或需要使用基类的方面。拥有这个基类意味着您可以在实现类之间拥有公共属性
例如:
public class A
{
public A()
{
}
}
public class B : A
{
public B() : base()
{
}
}
这种情况下,您只能定义一次NumberOfWheels
,只需为正在编写的实现适当地设置值。您可以使用virtual
方法对方法执行相同的操作
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;
}
}
这正在创建类型为B
的对象。它没有创建类型为A
的对象。但是,您是A
的对象。外行术语中的强制转换本质上意味着你在说“将此对象视为一个A
”。忽略它可能是aB
的事实。仅显示在类A
中定义的方法和属性
请注意,您可以将其重新转换回B
,这不会改变对象:
A myA = new B();
这两者之间的区别是:
B myB = (B)myA;
这是:
A myA = new A();
第一条语句正在创建类型为
a
的物理对象。将不会创建B
中定义的任何覆盖或新方法/属性/字段。第二条语句将创建一个类型为B
的物理对象,但要将其作为a
查看,我添加了一张更高级示例的照片,请看一看。您可以说:“……您仍然希望或需要使用基类的方面。”但派生类已经可以访问基类的成员,不是吗?那么为什么要扩展一个已经存在的特性呢?因为该特性的值可能不同。这也意味着您正在定义一个所有实现类都必须遵循的契约。我添加了一张更高级示例的照片,请看一看。
A myA = new B();