所以采取这个假设:
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;
}
}
}
这会出错,因为我给了那两个辅助属性的身体..但为什么他们不能拥有身体?什么是一个很好的方式我可以重新设计它,以便它构建?
答案 0 :(得分:5)
您不能在接口中执行此操作,因为该语言的设计使得接口只是必须实现的方法和属性的占位符。这是设计上的,通常是一种很好的做法。
抽象类与接口非常相似,但有两种不同的方式......
http://msdn.microsoft.com/en-us/library/k535acbf(v=vs.71).aspx
答案 1 :(得分:4)
关于Jonathan Allen在回答中所说的内容,我认为将助手添加为界面的扩展是理想的解决方案吗? (避免使用抽象类可能出现的多重继承问题)
有任何问题吗?
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;
}
}
答案 2 :(得分:2)
但为什么他们没有身体?
因为这不是CLR的设计方式,C#不能直接覆盖此限制。
理论上,C#可以为您提供代码并自动为该接口创建一个充满扩展方法的静态类,但这并不是真正符合C#的精神。
(你确实看到了VB中一些重写的CLR限制,但即便如此,也很少见。)
有什么好办法可以重新设计它以便构建它?
使用抽象类而不是接口。