如果我有两个接口:
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风格。
答案 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)
他们是完全相同的。
这与显式接口实现无关,因为可以使用Child1
和Child2
样式显式实现接口,例如:
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 { ... }