为什么不能在接口 c# 中使用帮助程序方法
本文关键字:帮助程序 方法 不能 接口 为什么 | 更新日期: 2023-09-27 18:33:20
所以假设:
public enum CollectionRange
{
One,
ZeroToOne,
ZeroToMany,
OneToMany
}
public interface ICollectableTypeTemplate
{
CollectionRange PossibleRange { get; }
bool MustHaveAtleastOneItem
{
get
{
return PossibleRange == CollectionRange.One ||
PossibleRange == CollectionRange.OneToMany;
}
}
bool MulipleOfTypeAllowed
{
get
{
return PossibleRange == CollectionRange.ZeroToMany ||
PossibleRange == CollectionRange.OneToMany;
}
}
}
这将出错,因为我已经给了这两个辅助属性 body.. 但是为什么他们不能有身体呢? 我可以重新设计它以便构建它的好方法是什么?
不能在接口中执行此操作,因为该语言的设计使接口只是必须实现的方法和属性的占位符。这是设计使然,通常是一种很好的做法。
抽象类与接口非常相似,但两种方式不同......
- 它可以有定义的逻辑。因此,出于您的目的,您将使用抽象类。
- 一个类只能从一个抽象类继承,而它可以实现许多接口。
http://msdn.microsoft.com/en-us/library/k535acbf(v=vs.71).aspx
偏离
乔纳森·艾伦在他的回答中所说的,我认为添加助手作为接口的扩展是理想的解决方案?(避免使用抽象类可能出现的多重继承问题)
有什么问题吗?
public enum CollectionRange
{
One,
ZeroToOne,
ZeroToMany,
OneToMany
}
public interface ICollectableTypeTemplate
{
CollectionRange PossibleRange { get; }
}
public static class MyExtentions
{
public static bool MustHaveAtleastOneItem(this ICollectableTypeTemplate i)
{
return i.PossibleRange == CollectionRange.One ||
i.PossibleRange == CollectionRange.OneToMany;
}
public static bool MulipleOfTypeAllowed(this ICollectableTypeTemplate i)
{
return i.PossibleRange == CollectionRange.ZeroToMany ||
i.PossibleRange == CollectionRange.OneToMany;
}
}
但是为什么他们不能有身体呢?
因为这不是 CLR 的设计方式,C# 无法直接覆盖此限制。
从理论上讲,C#可以为您提供代码并自动为该接口创建一个充满扩展方法的静态类,但这并不符合C#的精神。
(您确实在 VB 中看到了一些 CLR 限制的覆盖,但即使在那里也很少见。
我可以重新设计它以便构建它的好方法是什么?
使用抽象类而不是接口。