2013-12-14 43 views
1

我有以下为什么是C#中的行为抽象类和接口?

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
} 

现在成功编译的代码?为什么不需要重写childe类中的接口方法?

+1

您是否注意到接口定义了一个名为'mehtod'的方法,但抽象类定义了'method'? –

+0

您是否尝试过新编辑的答案?因为它现在编译没有任何错误。你的问题是约翰·桑德斯写的。 – Kikaimaru

+1

你不需要再次实现它,因为childe类已经有了从它的父Nomi1实现的“方法”方法。如果您想以其他方式实现它,请将Nomi1中的方法“虚拟”为虚拟并在childe类中覆盖它 – Kikaimaru

回答

3

您需要接口的explicit implementation。抽象类方法method()的实现满足了实现接口抽象方法的需要。因此,在类childe中定义接口的方法,但显式实现需要调用接口的方法,但不要调用类。

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
      Console.WriteLine("abstract class method"); 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
    void NomiInterface.method() 
    { 
      Console.WriteLine("interface method"); 
    } 
} 

您可以测试你如何可以调用抽象类和接口的实现目前的方法公子

childe c = new childe(); 
NomiInterface ni = new childe(); 
ni.method(); 
c.method(); 

输出是

interface method 
abstract class method 

在另一方面,如果你不做明确的接口实现,然后在childe类中给出的实现不会调用childe或接口对象。

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
     Console.WriteLine("abstract class method"); 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
    void method() { Console.WriteLine("interface method"); } 
} 

像我们以前那样创建类和接口的对象。

childe c = new childe(); 
NomiInterface ni = new childe(); 
ni.method(); 
c.method(); 

输出你会得到

abstract class method 
abstract class method 

作为附加的注释,你将采取命名类/方法名称约定的照顾。你可以找到更多关于命名约定here

+1

问题是他在界面上的__mehtod__中存在拼写错误。这个答案只是令人困惑。 – Kikaimaru

+0

@Kikaimaru - OP询问实现的来源,抽象类以及为什么不重写。阿迪尔的回答解释了这一点。 – Tim

+0

@Tim问题在我评论后编辑。但我仍然不明白这个答案。答案是他不需要在孩子中实现它,因为父母已经实现了它,并且它没有被覆盖,因为没有人覆盖它。显式接口实现对任何事情都没有帮助。 – Kikaimaru