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

时间:2012-08-18 12:34:48

标签: c# inheritance

  

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

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

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";  
  } 
}

3 个答案:

答案 0 :(得分:0)

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

逻辑按此顺序执行:

  1. 执行Shape(int x)
  2. 执行Triangle(int x)
  3. 因此,如果您拥有它们,则可以将调用指向不同的构造函数重载。另请注意,如果您的基类具有无参数构造函数,那么如果您未指定一个,则基本上会添加一个隐式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)调用两个以上构造函数的原因。

答案 1 :(得分:0)

如果我说得对,你的问题是,“它对pass a derived class reference to a base class reference有什么意义”,对吧?那么,如果是这样,那么你在问题中提到的情况并非如此。

相反,它意味着能够将派生类型引用传递给实际将基本类型引用作为其参数的方法。可以说,在ShapeTriangle类旁边,您创建了一个类Painter,它实际上绘制了您想要的形状 -

public class Painter
{
    ...

    public void Draw(Shape shape)
    {
        //Drawing logic
    }

    ...
}  

然后您创建了使用Painter类绘制形状的应用程序 -

class Program
{
    ...

    //instantiates the Painter class so you can draw different shapes
    Painter painter = new Painter();

    //instantiates the Shape type that you want to draw
    Triangle triangle = new Triangle(15);

    //draws the triangle, which actually is a Shape type
    painter.Draw(triangle);

    ...
}

在这里,您将派生类型引用(triangle对象)传递给实际采用基本类型引用(Shape对象)的方法,并且您可以通过以下方法之一OOP的三大支柱称为多态性。希望这有助于澄清。

答案 2 :(得分:0)

借助C#4.0 - Herbert Schildt的完整参考书。我会试着回答这个问题。我认为这个问题的例子是不完整的。如果在阅读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构造函数。这是将派生类引用传递给基类引用的示例。有关详细信息,请参阅第299页 Herbert Schildt's book.