为什么在接口c#中没有辅助方法?

时间:2014-12-05 04:15:22

标签: c# interface

所以采取这个假设:

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;
        }
    }

}

这会出错,因为我给了那两个辅助属性的身体..但为什么他们不能拥有身体?什么是一个很好的方式我可以重新设计它,以便它构建?

3 个答案:

答案 0 :(得分:5)

您不能在接口中执行此操作,因为该语言的设计使得接口只是必须实现的方法和属性的占位符。这是设计上的,通常是一种很好的做法。

抽象类与接口非常相似,但有两种不同的方式......

  1. 它可以定义逻辑。因此,为了您的目的,您将使用抽象类。
  2. 一个类只能从一个抽象类继承,而它可以实现许多接口。
  3. 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限制,但即便如此,也很少见。)


  

有什么好办法可以重新设计它以便构建它?

使用抽象类而不是接口。