Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在创建派生类的新对象时使用基类的构造函数?_C#_Oop_Inheritance - Fatal编程技术网

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

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(); } } 此外,此代码可能更接近此问题: 我知道这可能是一个非常基本的问题,但我

如果myA是一个类的实例,为什么我使用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
类的实现以及它们的用途

编辑:

根据您的图像,您之所以调用like
Vehicle 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
”。忽略它可能是a
B
的事实。仅显示在类
A
中定义的方法和属性

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

A myA = new B();
这两者之间的区别是:

B myB = (B)myA;
这是:

A myA = new A();

第一条语句正在创建类型为
a
的物理对象。将不会创建
B
中定义的任何覆盖或新方法/属性/字段。第二条语句将创建一个类型为
B
的物理对象,但要将其作为
a

查看,我添加了一张更高级示例的照片,请看一看。您可以说:“……您仍然希望或需要使用基类的方面。”但派生类已经可以访问基类的成员,不是吗?那么为什么要扩展一个已经存在的特性呢?因为该特性的值可能不同。这也意味着您正在定义一个所有实现类都必须遵循的契约。我添加了一张更高级示例的照片,请看一看。
A myA = new B();