C#:我派生的 class 无法覆盖基 class 的接口方法实现,为什么?
C#: my derived class cannot override base class's interface method implementation, why?
我有下面的代码,我用class"B"继承class"A",而我想从接口IMy实现F函数。但是编译器告诉我我正在隐藏接口方法 "F"。所以 运行 结果是 "A"。
我希望这个程序输出 "B"。我不想使用隐式接口实现,因为我希望在 main 函数中使用普通的多态性。
如何更正我的代码?谢谢
public interface IMy
{
void F();
}
public class A : IMy
{
public void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public void F()
{
Console.WriteLine("B");
}
}
class Program
{
static void Main(string[] args)
{
IMy my = new B();
my.F();
}
}
您当前的代码相当于:
public class A : IMy
{
public void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public new void F() // <--- Note 'new' here
{
Console.WriteLine("B");
}
}
您隐式地将方法标记为新方法,除非您显式写入,否则将生成编译器警告。
你真正想要的是覆盖方法,所以声明:
public class A : IMy
{
public virtual void F() // <--- Mark as virtual to allow subclasses to override
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void F() // <-- Override the method rather than hiding it
{
Console.WriteLine("B");
}
}
要覆盖 C# 中的方法,基 class 中的方法需要显式标记为 virtual
。方法是否实现接口方法无关紧要
public class A : IMy
{
public virtual void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void F()
{
Console.WriteLine("B");
}
}
我有下面的代码,我用class"B"继承class"A",而我想从接口IMy实现F函数。但是编译器告诉我我正在隐藏接口方法 "F"。所以 运行 结果是 "A"。
我希望这个程序输出 "B"。我不想使用隐式接口实现,因为我希望在 main 函数中使用普通的多态性。
如何更正我的代码?谢谢
public interface IMy
{
void F();
}
public class A : IMy
{
public void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public void F()
{
Console.WriteLine("B");
}
}
class Program
{
static void Main(string[] args)
{
IMy my = new B();
my.F();
}
}
您当前的代码相当于:
public class A : IMy
{
public void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public new void F() // <--- Note 'new' here
{
Console.WriteLine("B");
}
}
您隐式地将方法标记为新方法,除非您显式写入,否则将生成编译器警告。
你真正想要的是覆盖方法,所以声明:
public class A : IMy
{
public virtual void F() // <--- Mark as virtual to allow subclasses to override
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void F() // <-- Override the method rather than hiding it
{
Console.WriteLine("B");
}
}
要覆盖 C# 中的方法,基 class 中的方法需要显式标记为 virtual
。方法是否实现接口方法无关紧要
public class A : IMy
{
public virtual void F()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void F()
{
Console.WriteLine("B");
}
}