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)を変更するために基本メソッドをオーバーライドしたくありません。
はい、doStuff
をvirtual
でA
として宣言し、次にoverride
でB
として宣言した場合。
class A
{
public virtual void doStuff()
{
Console.WriteLine("A did stuff");
}
}
class B : A
{
public override void doStuff()
{
Console.WriteLine("B did stuff");
}
}
Bは継承によって事実上Aであり、メソッドはオーバーロードされているためです。
A a = new B();
a.doStuff();
投稿したクラス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");
}
}