1

このMSDNの記事で参照されているように:

派生クラスの型オブジェクトは、基本クラスから継承された新しい再定義されたメソッドにアクセスできず、継承されたShowDetails()メソッド内のメソッドからの派生クラスのオブジェクトの呼び出しは、基本クラスDescribeCar()のメソッドに対して行われShowDetails()ます。

DescribeCar()メソッドもクラスで使用できる場合、ConvertibleCarいわゆるnew ShowDetails()メソッドが表示されないのはなぜですか?

class Car
{
    public void DescribeCar()
    {
        System.Console.WriteLine("Four wheels and an engine.");
        ShowDetails();
    }

    public virtual void ShowDetails()
    {
        System.Console.WriteLine("Standard transportation.");
    }
}

// Define the derived classes.

// Class ConvertibleCar uses the new modifier to acknowledge that ShowDetails
// hides the base class method.
class ConvertibleCar : Car
{
    public new void ShowDetails()
    {
        System.Console.WriteLine("A roof that opens up.");
    }
}


class Program
{

    static void Main(string[] args)
    {
        ConvertibleCar car2 = new ConvertibleCar();
        car2.DescribeCar();
    }
}

//output
// Four wheels and an engine.
// Standard transportation.
4

3 に答える 3

4

new 古いメソッドを非表示にします。つまり、インスタンスで直接呼び出すと、派生クラスの動作が得られますが、ポリモーフィックConvertibleCarには呼び出されません。

基本クラスがそれを呼び出すと、仮想メソッドが呼び出されます。仮想メソッドはオーバーライドされていないため、基本クラスのメソッドを呼び出します。メソッドの非表示 (とにかくほとんど使用しない) を使用する代わりに、オーバーライドするだけです

class ConvertibleCar : Car
{
    public override void ShowDetails()
    {
        System.Console.WriteLine("A roof that opens up.");
    }
}
于 2015-03-25T17:05:04.277 に答える
1

よく考えてみると (継承がないCar.DescribeCarことを考えてみてください)、これはにアクセスできない理由を尋ねるようなものConvertibleCar.ShowDetailsです。

ConvertibleCar.ShowDetails基本的には、キーワードCarのために、必要に応じてのメンバーではないメソッドです。ただし、方法があります。newCarShowDetails

Car.DescribeCarのメンバー メソッドとしてCar、 の可視性がCar.ShowDetailsあり、 ではないためConvertibleCar.ShowDetailsCar.ShowDetailsが呼び出されます。

たぶん、これはより明確になるでしょう。キーワードを使用するnewと、次のように考えることができます。

class Car
{
  ...
  public virtual void ShowDetails(){..}
}

class ConvertibleCar : Car
{
  public void new_ShowDetails(){}
}

Carの知識ConvertibleCar.new_ShowDetailsがないため、メソッドを呼び出すことができません。

于 2015-03-25T17:11:03.260 に答える