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

はい、三角形の前にその基本 Shape コンストラクターを呼び出すようにランタイムに指示します。

ロジックは次の順序で実行されます。

  1. Shape(int x) を実行
  2. Triangle(int x) を実行

したがって、別のコンストラクター オーバーロードがある場合は、その呼び出しを直接行うことができます。また、基本クラスにパラメーターなしのコンストラクターがあるbase()場合、指定しないと基本的に暗黙的に追加されることに注意してください。つまり、基本クラスにパラメーターなしのコンストラクターがない場合、すべてのサブクラスはコンストラクターで有効にする必要base(...parameters...)があります。

また、 base の代わりに使用this()して、現在のサブクラス クラスのコンストラクターをターゲットにすることもできます。

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)、2 つ以上のコンストラクターを呼び出します。

于 2012-08-18T13:01:07.893 に答える
0

本 C# 4.0 - The Complete Reference by 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 の 2 番目のコンストラクターは Triangle オブジェクトを受け取り、これを基本型である Shape コンストラクターに渡します。これは、派生クラスの参照を基底クラスの参照に渡す例です。詳細については、 Herbert Schildt の本の 299 ページを参照してください。

于 2014-09-30T13:58:01.110 に答える