静态成员和接口



我刚刚浏览了关于这个主题的一些SO问题,发现(目前?)不可能在接口中定义静态成员或使静态方法成为虚方法。我现在正与一种情况作斗争。让我用一个简单的例子来描述它:

我有一个命名为IAnimal的接口,定义如下:

interface IAnimal {
    ...
    int Chromosomes {get; } //should ideally be static, but that's not allowed!
    ...
}

然后我有一个实现IAnimal的基类Animal,并提供对所有动物通用的一些方法的实现:

abstract class Animal : IAnimal { 
    ...
    public abstract int Chromosomes {get; } //necessary becuz of IAnimal
    ...
}

下面我有Dog, CatZebra类,它们继承自Animal,并为它们的物种提供该属性的具体实现。

现在的问题是:这些类是在运行时发现的(通过Assembly.LoadFile(),因为有可插模块)。发现的类保存在List<System.Type>中,我们稍后使用它来创建具体的狗和猫。创建动物的输入参数是染色体数,因此,例如他们会问:创建具有72条染色体的动物类型。所以我需要以某种方式获得List中每个Type的染色体属性值,并返回第一个匹配的Type

由于Chromosomes不是静态的(如果它是,我可以很容易地运行给定类型的静态成员),我是否被迫创建每种类型的临时对象,然后用它调用Chromosomes,或者有更好的方法?如果有帮助,我的List中的所有元素都保证是IAnimal

基本上c#类型系统并没有为此做好准备。这通常不是的问题,但当它出现时,它是一个痛苦:(您可能需要考虑一些选项,所有这些选项都始于删除现有的属性:

  • 为类型本身(DogType, AnimalType等)创建一个单独的类型层次结构,如果有用的话,它也可以负责创建实例。这往往有点痛苦。
  • 向类型添加一个属性,指示染色体的数量——当然,这只在值不变时有效。然后,您可以通过反射找到属性值。但在编译时不会强制执行。
  • 创建一个可以通过反射调用的静态属性,然后添加单元测试以确保实现接口的每个类型也具有静态属性

相关内容

  • 没有找到相关文章

最新更新