静态成员和接口
我刚刚对这个主题进行了一些SO问题,发现这是(目前?)不可能在接口中定义静态成员或者使静态方法成为虚拟。 我现在正在努力应对这种情况。 让我试着用一个简单的例子来描述它:
我有一个名为say 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
inheritance的Dog
, Cat
和Zebra
类,并为它们的物种提供这个属性的具体实现。
现在问题是:这些类是在运行时发现的(通过Pluggable-modules的Assembly.LoadFile()
becuz)。 发现的类保存在List
,我们稍后用它来创建具体的狗和猫。 用于创建动物的输入参数是染色体编号,因此例如他们会问: 创建具有72条染色体的类型的动物。 所以我需要以某种方式获取List
中每个Type
的Chromosome属性值并返回第一个匹配的Type
。
由于Chromosomes
不是静态的(如果是,我可以很容易地运行给定类型的静态成员 ),我是否被迫创建每种类型的临时对象,然后用它调用Chromosomes
,或者有更好的方法吗? 如果有帮助的话,我List
中的所有元素都被保证为IAnimal
。
基本上C#型系统并不适合这种情况。 这通常不是一个问题,但是当它确实出现时会很痛苦:(你可能想要考虑的一些选项,所有选项都是从删除现有属性开始的:
- 为类型本身(
DogType
,AnimalType
等)创建单独的类型层次结构,如果有用,也可以负责创建实例。 这往往有点痛苦。 - 在类型中添加一个属性,指示染色体的数量 – 当然,这仅在值恒定时才有效。 然后,您可以使用reflection查找属性值。 但它不会在编译时强制执行。
- 创建一个可以用reflection调用的静态属性,然后添加unit testing以确保实现该接口的每个类型都具有静态属性