web-dev-qa-db-ja.com

親から子クラスメソッドを呼び出す

A.doStuff()メソッドがAクラスを編集せずに「Bdidstuff」を出力することは可能ですか?もしそうなら、私はそれをどのように行うでしょうか?

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        B b = new B();

        a.doStuff();
        b.doStuff();

        Console.ReadLine();
    }
}

class A
{
    public void doStuff()
    {
        Console.WriteLine("A did stuff");
    }
}

class B : A
{
    public void doStuff()
    {
        Console.WriteLine("B did stuff");
    }
}

Steamゲーム、Terrariaを改造しています。そして、それがSteamを台無しにするので、私はそれをすべて逆コンパイルして再コンパイルしたくありません。私のプログラムは、XNAを介してTerrariaに「注入」します。 XNAのupdate()メソッドとdraw()メソッドを使用して、いくつかの変更を行うことができます。しかし、それはかなり限られています。より多くのもの(たとえばworldgen)を変更するために基本メソッドをオーバーライドしたくありません。

13
user1178494

はい、doStuffvirtualAとして宣言し、次にoverrideBとして宣言した場合。

class A
{
    public virtual void doStuff()
    {
        Console.WriteLine("A did stuff");
    }
}

class B : A
{
    public override void doStuff()
    {
        Console.WriteLine("B did stuff");
    }
}
18
Aliostad

Bは継承によって事実上Aであり、メソッドはオーバーロードされているためです。

A a = new B();
a.doStuff();
2
mdprotacio

投稿したクラスAおよびBのコードは、とにかく以下のコンパイラ警告を生成し、クラスBでnewキーワードを使用するように要求しますが、コンパイルされます:キーワードnewは、継承されたメンバー 'A.doStuff()'を非表示にするため、 'B.doStuff()'に必要です。

使用する method hidingクラスMapperおよびクラスBのnewおよびvirtualキーワードとともに次のようになります。

class Program
{
    static void Main(string[] args)
    {
        Mapper a = new B(); //notice this line
        B b = new B();

        a.doStuff();
        b.doStuff();

        Console.ReadLine();
    }
}

class A
{
    public void doStuff()
    {
        Console.WriteLine("A did stuff");
    }
}

class Mapper : A
{
    new public virtual void doStuff() //notice the new and virtual keywords here which will all to hide or override the base class implementation
    {
        Console.WriteLine("Mapper did stuff");
    }
}

class B : Mapper
{
    public override void doStuff()
    {
        Console.WriteLine("B did stuff");
    }
}
0
VS1