2012-01-30 10 views
10

a.doStuff()メソッドがAクラスを編集せずに "B did stuff"を印刷することは可能ですか?もしそうなら、どうすればいいのですか?親クラスから子クラスメソッドを呼び出す

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

私は蒸気ゲームTerrariaを改造しています。そして、私は逆コンパイルと再コンパイルを望んでいません。私のプログラムは、XNA経由でTerrariaに「注入」されます。 XNAのupdate()メソッドとdraw()メソッドを使っていくつかのことをmodにすることができます。しかし、かなり限られています。私は、より多くのものをモディファイするために基本メソッドをオーバーライドすることはできませんでした(たとえばワールドジェン)。

答えて

13

はい、あなたはAvirtualようdoStuffを宣言してからBoverride場合。

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

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

A.doStuffはオーバーライドされるだけなので、仮想ではなく抽象である必要があります。 –

2

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

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

もちろん、仮想とオーバーライドで行うこともできますが、これは要求通りにAを変更せずに行う唯一の方法ですOP –

+0

ありがとうございます。おそらく私はOPでこれを明らかにしていたはずです。私は蒸気ゲームTerrariaを改造しています。そして、私は逆コンパイルと再コンパイルを望んでいません。私のプログラムは、XNA経由でTerrariaに「注入」されます。 XNAのupdate()メソッドとdraw()メソッドを使っていくつかのことをmodにすることができます。しかし、かなり限られています。私は、より多くのものをモディファイするために基本メソッドをオーバーライドすることはできませんでした(たとえばワールドジェン)。 – user1178494

+0

@ user1178494新しいキーワードを使用して更新された回答を参照してください。 – VS1

0

クラスのためにあなたが投稿した& Bはとにかくコンパイラ警告の下に生成し、それをコンパイルしますが、クラスBにnewキーワードを使用するように依頼しますコードは: キーワードnewが「上必要とされますクラスマッパーとクラスBにおけるnewvirtualキーワードと共にB.doStuff()A.doStuff()」は、継承されたメンバーを隠しているため 『』

使用method hiding次のよう

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

ありがとうございますが、これはa.doStuff()を呼び出すときには "A did stuff"という文字を表示します。 – user1178494

+0

@ user1178494私は自分の答えを更新しました、plsそれを試して、AとBのクラスの間でMapper(Mediator)クラスの使用に気づいてください、それがあなたの問題を解決するかどうかを見てください.. – VS1

+0

それはまだ悲しいことに、動作しません。私を助けてくれてありがとう。 – user1178494

関連する問題