3

将派生类引用传递给基类引用

这是否意味着从派生类调用基类,就像构造函数三角形会调用基类?

class Shape {
public int width, height;
 public Shape(int x) { 
    width = height = x; 
    } 
}

class Triangle : Shape { 
 public string style;
  public Triangle(int x) : base(x) { 
    style = "isosceles";  
  } 
}
4

2 回答 2

1

是的,它将指示运行时在 Triangle 之前调用基本 Shape 构造函数。

逻辑按以下顺序执行:

  1. 执行形状(int x)
  2. 执行三角形(int x)

因此,如果您有不同的构造函数重载,您可以直接调用它们。另请注意,如果您的基类具有无参数构造函数,则base()如果您未指定一个,则本质上是隐式添加的。这意味着如果您的基类没有参数构造函数,则所有子类都必须在其构造函数中有效base(...parameters...)

此外,您可以使用this()而不是 base 来定位当前子类的构造函数。

public class MyBaseClass
{
    public MyBaseClass()
    {
        Console.WriteLine("MyBaseClass Parameterless");
    }

    public MyBaseClass(string message)
    {
        Console.WriteLine("MyBaseClass Message: " + message);
    }
}

public class MySubClass
{
    public MySubClass()
    {
        Console.WriteLine("MySubClass Parameterless");
    }

    public MySubClass(string message)
        : base(message)
    {
        Console.WriteLine("MySubClass Message: " + message);
    }

    public MySubClass(bool someUselessFlag)
        : this()
    {
        Console.WriteLine("MySubClass bool someUselessFlag constructor");
    }
}

输出将是:

var a = new MySubClass();
//outputs:
//MyBaseClass Parameterless
//MySubClass Parameterless

var b = new MySubClass("Hello World!");
//outputs:
//MyBaseClass Message: Hello World!
//MySubClass Message: Hello World!

var c = new MySubClass(true);
//outputs:
//MyBaseClass Parameterless
//MySubClass Parameterless
//MySubClass bool someUselessFlag constructor

构造函数会自行链接,直到最终调用Object()基本构造函数。这就是为什么var c = new MySubClass(true)调用两个以上的构造函数。

于 2012-08-18T13:01:07.893 回答
0

借助 Herbert Schildt 的 C# 4.0 - The Complete Reference 一书。我会试着回答这个问题。我认为这个问题的例子是不完整的。如果在阅读 Herbert Schildt 的一本 C# 书籍时提出了这个问题。那么这个例子可能是这样的:

class Shape
{
    public int width, height;
    public Shape(int x)
    {
        width = height = x;
    }

    public Shape(Shape shape)
    {
        width = shape.width;
        height = shape.height;
    }
}

class Triangle : Shape
{
    public string style;
    public Triangle(int x)
        : base(x)
    {
        style = "isosceles";
    }
    public Triangle(Triangle triangle)
        : base(triangle)
    {
        style = triangle.style;
    }
}

class Draw
{
    static void Main()
    {
        Triangle triangle1 = new Triangle(5);
        Triangle triangle2 = new Triangle(triangle1);
    }
}

这里 Triangle 的第二个构造函数接收一个 Triangle 对象并将其传递给基本类型的 Shape 构造函数。这是将派生类引用传递给基类引用的示例。有关这方面的更多信息,请参阅 Herbert Schildt 著作的第 299 页。

于 2014-09-30T13:58:01.110 回答