2

私は2つのクラスがあります

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }

    public void GetName()
    {
        Console.Write(Name);
    }
}

public class B : A
{
    public B(string N) : base(N)
    {
    }

    public new void GetName()
    {
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

新しいオブジェクトを作成しますB私は電話したいGetNameからAそしてGetNameからB

B foo = new B("foo");
foo.GetName(); //  output "oof"

期待される出力"foooof"

私はすでに試したpublic new void GetName() : baseしかし、それはコンパイルされません

3 답변


2

あなたの希望する出力を得るために、あなたは呼び出す必要がありますbase GetName()メソッドGetName()の方法Class B。例えばこんな感じです:

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }

    public void GetName()
    {
        Console.Write(Name);
    }
}

public class B : A
{
    public B(string N) : base(N)
    {
    }

    public new void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

これは出ますfoooof


2

オーバーライドを使用して、オーバーライドされたメソッドから基本クラスのメソッドを呼び出します。

public class A
{
    public virtual void GetName()
    {
        Console.Write(Name);
    }
}

public class B : A
{
    public override void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

virtualキーワードを使用してメソッドを変更し、派生クラスでそのメソッドをオーバーライドできるようにします。new修飾子は基本クラスのメソッドを隠します。を呼び出すことによってbase.GetName();基本メソッドBTWを実行しているので、これを使用しても違いはありません。newまたはoverrideここでのキーワードoverride

参考文献:

仮想(C#リファレンス)

上書きおよび新しいキーワードをいつ使用するかを知る


  • base.GetName();なしで動作するようですoverrideも - Toshi
  • @GodofSource virtualキーワードは、メソッドを変更し、それが派生クラスでオーバーライドされることを可能にするために使用されます。だからあなたは組み合わせることができますGetName上記のコードに記載されているような結果です。 - S.Akbari
  • @GodofSource override修飾子は基本クラスのメソッドを拡張し、新しい修飾子はそれを隠します。電話でbase.GetName();あなたが基本的な方法BTWを実行しているのはこれがあなたが使うのに違いがない理由ですnewまたはoverrideここに。しかし、あなたはそれを知っておくべきですnew基本メソッドを隠しましたが、オーバーライドを使用してそれを拡張しました。 - S.Akbari
  • @GodofSourcenew危険です。自分のしていることがわからない場合は、使用しないでください。 - Patrick Hofman
  • 「拡張」の意味 - Toshi

0

public class A
{
    public A(string N)
    {
        Name = N;
    }
    public string Name { get; set; }

    public virtual void GetName()
    {
        Console.Write(Name);
    }
}

public class B : A
{
    public B(string N) : base(N)
    {
    }

    public override void GetName()
    {
        base.GetName();
        Console.Write(new string(Name.Reverse().ToArray()));
    }
}

選択に応じて上書きまたは新規を使用してください。 これらのシナリオを扱うのが好きです。

            A foo = new B("foo");
            foo.GetName();

または

            A foo = new A("foo");
            foo.GetName();

または

            B foo = new B("foo");
            foo.GetName();

このmsdnリンクあなたにはっきりした絵を与えます。

リンクされた質問


関連する質問

最近の質問