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()方法修改一些东西。但它非常有限。我不想覆盖基本方法来修改更多东西(例如,worldgen)。
答案 0 :(得分:17)
是的,如果您在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");
}
}
答案 1 :(得分:2)
由于B通过继承实际上是A,并且该方法被重载。
A a = new B();
a.doStuff();
答案 2 :(得分:0)
A级和A级的代码B你已发布将继续生成以下编译器警告,并将要求在B类上使用new
关键字,尽管它将编译:
'B.doStuff()'需要关键字new,因为它隐藏了继承的成员'A.doStuff()'
在Mapper和B类中使用method hiding
以及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");
}
}