为什么不能在接口 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.. 但是为什么他们不能有身体呢? 我可以重新设计它以便构建它的好方法是什么?

为什么不能在接口 c# 中使用帮助程序方法

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

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

  1. 它可以有定义的逻辑。因此,出于您的目的,您将使用抽象类。
  2. 一个类只能从一个抽象类继承,而它可以实现许多接口。

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 限制的覆盖,但即使在那里也很少见。


我可以重新设计它以便构建它的好方法是什么?

使用抽象类而不是接口。