[英]Interface implementation and inheritance in C#
我有一些代码可以在C#中实现接口
public interface Intfc { void xyz();}
public class BaseClass : Intfc
{
public virtual void xyz()
{
Console.WriteLine("In Base Class");
}
}
public class Derived : BaseClass
{
public override void xyz()
{
Console.WriteLine("In Derived Class");
}
}
static void Main(string[] args)
{
Derived mc = new Derived();
mc.xyz(); //In Derived Class
((BaseClass)mc).xyz(); //In Base Class
((Intfc)mc).xyz(); //In Derived Class
Console.ReadKey();
}
我需要Main()
注释中提供的控制台输出。 实际结果是
In Derived Class
In Derived Class
In Derived Class
我怎样才能达到预期的效果。
您需要覆盖Derived类上的方法,而不是使用virtual / override运算符使用new运算符。
http://msdn.microsoft.com/en-us/library/51y09td4(VS.71).aspx#vclrfnew_newmodifier
尝试
public interface Intfc { void xyz();}
public class BaseClass : Intfc
{
public void xyz()
{
Console.WriteLine("In Base Class");
}
}
public class Derived : BaseClass
{
new public void xyz()
{
Console.WriteLine("In Derived Class");
}
}
static void Main(string[] args)
{
Derived mc = new Derived();
mc.xyz(); //In Derived Class
((BaseClass)mc).xyz(); //In Base Class
((Intfc)mc).xyz(); //In Derived Class
Console.ReadKey();
}
不要将virtual
方法与override
修饰符一起使用,而是在Derived
类上重新实现接口。
下面的代码展示了必需的行为,但是我认为这种方法对于最终用户而言有些混乱和不透明。
public interface Intfc { void xyz();}
public class BaseClass : Intfc
{
public void xyz()
{
Console.WriteLine("In Base Class");
}
}
public class Derived : BaseClass,Intfc
{
public void xyz()
{
Console.WriteLine("In Derived Class");
}
}
static void Main()
{
Derived mc = new Derived();
mc.xyz(); //In Derived Class
((BaseClass)mc).xyz(); //In Base Class
((Intfc)mc).xyz(); //In Derived Class
}
您无法执行此操作, mc
是Derived
类型的,它将始终在此类中调用xyz
。 这就是继承的原理。 您需要一个BaseClass实例:
var bc = new BaseClass();
bc.xyz(); // In Base Class
您将需要一个var b = new BaseClass()
。 然后b.xyz()
代替((BaseClass)mc).xyz()
。
您很想了解继承的行为。
当您创建覆盖某个虚拟方法的给定类型的对象时,您总是会从该覆盖方法中获得结果。 强制转换不会更改对象的结构,一旦创建对象即可在强制转换操作后更改其状态。
static void Main(string[] args)
{
Intfc mc1 = new Derived();
Intfc mc2 = new BaseClass();
mc1.xyz();
mc2.xyz();
Console.ReadKey();
}
这将产生
In Base Class
In Derived Class
但是因为总有一个but。
如果您覆盖该方法,则将得到您想要的结果,要覆盖该方法,只需使用运算符new
public class Derived : BaseClass
{
new public void xyz()
{
Console.WriteLine("In Derived Class");
}
}
public class BaseClass : Intfc
{
public void xyz()
{
Console.WriteLine("In Base Class");
}
}
这将对DeriveClass使用新的实现,对BaseClass使用旧的实现。
链接:
在mc中将修饰符override
添加到继承的虚拟方法xyz时,您只需在mc引用的实例中覆盖继承的虚拟方法。 就像您擦除了Base.xyz并将Derived.xyz写入mc实例的内存中一样。 因此,由mc引用的实例在其实现中没有虚拟xyz的记录,因此无法通过mc引用获取该实例。 访问基础虚拟方法的唯一方法是通过基础实例,如下所示:
var b = new BaseClass();
b.xyz();// instead of ((BaseClass)mc).xyz()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.