C#base继承

Cha*_*les 5 c# inheritance class

这个问题已经开启/关闭困扰我,我现在写了4个封装.我确信我做错了,需要找出我的理解分支的地方.

假设我使用Rectangle类来表示金属条.(这比动物更好)

所以说基类叫做"Bar".

private class Bar
{
   internal Rectangle Area;
}
Run Code Online (Sandbox Code Playgroud)

所以.现在我们制作一个矩形,比如300个单位乘10个单位.

private Bar CreateBar()
{
    Bar1 = new Bar1();
    Bar1.Area = new Rectangle(new Point(0,0), new Size(300,10));
    return Bar1;
}
Run Code Online (Sandbox Code Playgroud)

很棒,所以我们有一个基础吧.

现在让我们说我们想让这个酒吧有一种材料 - 比如钢铁.所以...

private class SteelBar : Bar
{
    string Material;
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我这样做...

private SteelBar CreateSteelBar()
{
    SteelBar SteelB = new SteelB();
    Bar B = CreateBar();
    SteelB = B;
    SteelB.Material = "Steel";
    return SteelB;
}
Run Code Online (Sandbox Code Playgroud)

从我得到的内容,如果我调用CreateSteelBar,它会创建一个调用CreateBar的钢条.所以我最终得到了一个带有300×10矩形的钢筋,以及一个用于材料的无绳或空绳.然后我将材料设置为钢.

当我在我的程序中尝试类似的东西时,它一直在告诉我不能隐含地从较低级别的类中创建更高级别的类.考虑到我所看到的动物实例的所有遗传,我想这就是继承存在的原因,但我希望有人可以让我知道.

此外,我确信我可以打电话,SteelBar = CreateBar();但我在这里做了很长的路.

Ree*_*sey 16

CreateBar你没有使用method(),而是使用构造函数:

public Bar()
{
    this.Area = new Rectangle(new Point(0,0), new Size(300,10));
}
Run Code Online (Sandbox Code Playgroud)

然后,在SteelBar中,您将调用基类构造函数:

public SteelBar()
{
    this.Material = "Steel";
}
Run Code Online (Sandbox Code Playgroud)

基类构造函数将首先出现,因此您的区域已经设置好.不过,您可以明确地说明这一点,并将其显示在您的代码中:

public SteelBar()
    : base()
{
    this.Material = "Steel";
}
Run Code Online (Sandbox Code Playgroud)

但是,这通常仅在您希望具有带参数的特定构造函数时使用.

有关详细信息,请参阅C#编程指南中的构造函数.

  • @KyleTrauberman这是不真实的 - 基类构造函数**总是被**隐式调用.如果要调用默认的无参数构造函数以外的构造函数,则只需指定它.没有调用其中一个基类构造函数就无法构造子类. (6认同)