2010-10-21 128 views
1

我有一些代码来实现在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 

我该如何达到预期的效果。

+0

这是设计。你能给我们一个真实世界的例子吗? – 2010-10-21 08:23:02

回答

1

您需要覆盖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(); 

} 
+1

这回答了这个问题,但值得注意的是,如果有的话,应该偶尔使用这种'new'。 – 2010-10-21 08:28:16

+0

我同意,但我确定他有一个请求这种行为的原因:) – 2010-10-21 08:30:34

+0

是的,所需的行为只是简单的怪异,无论实施。顺便说一下,是否可以重写非虚拟方法。我怀疑这个代码不会编译。 – spender 2010-10-21 08:36:12

0

你不能这样做,mcDerived的类型,它将始终在本课程中调用xyz。这就是继承的工作原理。您需要一个BaseClass实例:

var bc = new BaseClass(); 
bc.xyz(); // In Base Class 
+0

downvote的任何原因? downvoting时请留言。 – 2010-10-21 08:35:53

0

您将需要一个var b = new BaseClass()。然后b.xyz()而不是((BaseClass)mc).xyz()

1

不要使用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 



} 
0

你很想理解继承的行为。

当您创建一个给定类型的对象覆盖某些虚拟方法您将一直得到该覆盖方法的结果。铸造操作不会改变对象结构,一旦创建对象可以改变他的状态。

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 

但因为总有一个,但。

如果您覆盖这个方法,你会得到的结果是什么你是最多,覆盖方法只使用运营商

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的。

链接:

What override is ?

Modifier new in method signature

What modifier new is ?

0

当您添加改性剂override在MC继承的虚方法某某,你只需在重载了继承的虚方法由mc引用的实例。就好像你擦除了Base.xyz并将Derived.xyz写入了mc实例的内存中。因此,由mc引用的实例在其实现中没有虚拟xyz的记录,因此没有办法通过mc引用来获取它。访问基地的虚拟方法的唯一方法是通过基地的一个实例,如下所示:

var b = new BaseClass();  
b.xyz();// instead of ((BaseClass)mc).xyz()