我应该在继承链中包含所有接口吗?

时间:2017-08-16 05:10:30

标签: c# inheritance interface

如果我有两个接口:

    interface IGrandparent
    {
        void DoSomething();
    }

    interface IParent : IGrandparent
    {
        void DoSomethingElse();
    }

然后有两个实现:

//only includes last interface from the inheritance chain
public class Child1 : IParent 
{
    public void DoSomething()
    {
        throw new NotImplementedException();
    }

    public void DoSomethingElse()
    {
        throw new NotImplementedException();
    }
}

// includes all the interfaces from the inheritance chain    
public class Child2 : IGrandparent, IParent     
{
    public void DoSomething()
    {
        throw new NotImplementedException();
    }

    public void DoSomethingElse()
    {
        throw new NotImplementedException();
    }
}

这两个实现是否相同? (班级名称除外)?有人说与隐含和明确的实施有关,有人会解释原因吗?我比其他人看到了Child2风格。

2 个答案:

答案 0 :(得分:4)

当diffirent接口没有冲突的方法名称时会发生隐式接口实现,这是常见的情况。
另一方面,重复的是,当存在冲突的方法名称时,此时您必须指定在该方法中实现哪个接口。

public interface IFoo
{
    void Do();   // conflicting name 1
}

public interface IBar
{
    void Do();   // conflicting name 2
}

public class FooBar : IFoo, IBar
{
    void IFoo.Do()    // explicit implementation 1
    {            
    }

    void IBar.Do()    // explicit implementation 1
    {
    }
}

请注意,明确实现的接口方法不能公开。 Here you can read more about explicit interface implementation.

谈谈你的具体例子。您只能安全地使用IParent。即使你想使用激活接口实现,你仍然可以在没有特别提及类声明中的IGrandparent的情况下实现它。

interface IGrandparent
{
    void DoSomething();
}

interface IParent : IGrandparent
{
    void DoSomethingElse();

    void DoSomething();
}

public class Child : IParent
{
    void IGrandparent.DoSomething()
    {
    }

    public void DoSomethingElse()
    {
    }

    public void DoSomething()
    {
    }
}

编辑:正如Dennis所指出的那样,还有其他几种明确的接口实现用法,包括接口重新实现。我在here找到了隐式vs显式接口实现用法的非常好的推理(你可能也想查看整个帖子,这很有趣)。

答案 1 :(得分:1)

他们是完全相同的。

这与显式接口实现无关,因为可以使用Child1Child2样式显式实现接口,例如:

public class Child2 : IGrandparent, IParent
{
    void IGrandparent.DoSomething()
    {
        throw new NotImplementedException();
    }

    public void DoSomethingElse()
    {
        throw new NotImplementedException();
    }
}

public class Child1 : IParent
{
    void IGrandparent.DoSomething()
    {
        throw new NotImplementedException();
    }

    public void DoSomethingElse()
    {
        throw new NotImplementedException();
    }
}

请注意,这不应与类层次结构中的接口重新实现混淆:

public class Child1 : IParent
{
    public void DoSomething()
    {
        Console.WriteLine("Child1.DoSomething");
    }

    public void DoSomethingElse()
    {
        Console.WriteLine("Child1.DoSomethingElse");
    }
}

public class Child2 : Child1, IGrandparent
{
    // Child2 re-implements IGrandparent
    // using explicit interface implementation
    void IGrandparent.DoSomething()
    {
        Console.WriteLine("Child2.DoSomething");
    }
}

我会避免Child2风格。这只是一个视觉垃圾。此外,如果IGrandparent不是您的责任,那么有时您会得到这个:

interface IGrandparent : ICthulhu { ... }

您是否希望以这种方式更新您的代码:

public class Child2 : ICthulhu, IGrandparent, IParent { ... }