对于通用抽象对象工厂,继承无法正常工作

时间:2011-10-10 04:53:35

标签: c# generics inheritance

当我希望类层次结构的某些成员具有特殊构造代码而任何其他成员具有通用构造函数时,我有以下基本对象工厂。

我的问题是TileFactory没有方法GetInstance - 如果我尝试调用TileFactory.GetInstance(),我的程序将无法编译。有什么建议吗?

 public static class ObjectFactory<K>
        {
            public static T GetInstance<T>() where T : K
            {
                T obj = (T)Activator.CreateInstance(typeof(T));
                return obj;
            }
//snip
            }

        }
//snip
        public static class TileFactory : ObjectFactory<Tile>
        {
        }

2 个答案:

答案 0 :(得分:4)

Why can't I inherit static classes?

来自这里的引文:

这实际上是设计的。似乎没有充分的理由继承静态类。它有公共静态成员,您始终可以通过类名本身访问它们。我看到继承静态内容的唯一原因是糟糕的,例如保存几个字符的输入。

可能有理由考虑将静态成员直接引入范围的机制(事实上我们将在Orcas产品周期之后考虑这一点),但静态类继承不是要走的路:它是错误的使用机制,仅适用于碰巧驻留在静态类中的静态成员。

(Mads Torgersen,C#语言PM)

来自channel9的其他意见

.NET中的继承仅适用于实例库。静态方法是在类型级别上定义的,而不是在实例级别上定义的。这就是为什么覆盖不适用于静态方法/属性/事件......

静态方法只在内存中保存一次。没有为它们创建的虚拟表等。

如果在.NET中调用实例方法,则始终为其提供当前实例。这是.NET运行时隐藏的,但它确实发生了。每个实例方法都将第一个参数作为运行该方法的对象的指针(引用)。静态方法不会发生这种情况(因为它们是在类型级别定义的)。编译器应如何决定选择要调用的方法?

(littleguru)

作为一个有价值的想法,littleguru对此问题有一个部分“解决方法”:Singleton模式。

http://www.dofactory.com/Patterns/PatternSingleton.aspx

答案 1 :(得分:2)

静态事物没有继承。解决方法是使用单身人士。