我正在处理的代码有一个空接口:
public interface ICube {}
它没有方法或属性。
一些类实现了 ICube
接口,其他接口继承自 ICube
。
请有经验的人告诉我,ICube 接口有什么好处?
请阅读MSDN关于接口设计
的内容。
https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/interface
✓ 如果您需要支持一组类型(其中包括值类型)的共同API,则应定义一个接口。
✓ 如果您需要在已继承某个其他类型的类型上支持其功能,则可以考虑定义一个接口。
X 避免使用标记接口(没有成员的接口)。
如果您需要标记一个类具有特定的特征(标记),通常使用自定义属性而不是接口。
✓ 至少提供一个实现接口的类型。
这样做有助于验证接口的设计。例如,List是IList接口的实现。
✓ 至少提供一个使用您定义的每个接口的API(以接口作为参数的方法或以接口作为类型的属性)。
这样做有助于验证接口设计。例如,List.Sort消耗System.Collections.Generic.IComparer接口。
X 不要向先前发布的接口添加成员。
更多参考: 空接口 Are empty interfaces code smell?
标记接口 什么是标记接口的目的?
List<ICube>
。也许我作为方法参数收到它。public interface ICube {} // It's empty!
public void DoSomethingWithTheseCubes(List<ICube> cubes)
{
foreach(var cube in cubes)
{
// what do I do with this cube?
}
}
您可以看到我卡住了。 ICube
只是一个标记接口,因此它本身没有任何方法或属性。我无法对其进行任何操作。这可能会导致我将每个立方体强制转换为其他类型,以便可以对其进行某些操作。
public void DoSomethingWithTheseCubes(List<ICube> cubes)
{
foreach(var cube in cubes)
{
(SomeOtherType)cube.DoSomething();
}
}
但如果我进行类型转换,就会引发运行时错误,因为我可能无法确定每个对象的实际运行时类型。如果我知道运行时类型,那么我应该这样做:
public void DoSomethingWithTheseCubes(List<SomeOtherType> things)
{
foreach(var thing in things)
{
thing.DoSomething();
}
}
if (thisThing is ISomeType)
,但没有其他转换,那么这并不是很糟糕。对我来说,属性更有意义。 - Scott Hannen