ClassName<Type> or ClassName<Object> for abstract base class

ClassName<Type> or ClassName<Object> for abstract base class

我是 C# 编程的新手。我想创建包含一些 abstractvirtual 方法的 Abstract Base Class

通过下面两个例子,它们的用法有什么区别,哪个更常用?

示例 1,使用 Type 关键字。

public abstract class DecoratorBase<Type> : ValidatableBindableBase
{
    public virtual void SetFields(Type T) { }
    public virtual void SetFieldsBack(ref Type T) { }
}

示例 2,使用 Object 关键字。

public abstract class DecoratorBase<Object> : ValidatableBindableBase
{
    public virtual void SetFields(Object T) { }
    public virtual void SetFieldsBack(ref Object T) { }
}

在我的例子中,TypeObject 将代表我的商业模式 POCO class.

抱歉,如果这个问题对您来说太天真了。谢谢。

拜托,不要那样做!

看来您对泛型有点困惑。当您定义通用抽象类型时(在名称后使用 <>),您是在告诉编译器 "I will give you some type, but I don't know which type just now. Use the name I'm giving you as a placeholder for the type later." 约定是使用大写 T

例如,下面定义了一个通用抽象class。

public abstract class SomeClass<T> {}

稍后,当我们创建一个派生的 class 时,我们创建它的类型是:

public class ConcreteClass : SomeClass<int> {}

如果我们在摘要 class 中声明了使用类型 T 的方法,我们的新 ConcreteClass 会将对 T 的引用替换为 int .所以在你的情况下,你应该这样做:

public abstract class DecoratorBase<T> : ValidatableBindableBase
{
    public virtual void SetFields(T param) { }
    public virtual void SetFieldsBack(ref T param) { }
}

这里可以看到,T表示未知类型为T,而不是命名类型Type和参数T。你所做的被称为'hiding',也就是说,当你以你正在做的方式使用TypeObject时,它正在分配这些词的新含义。你应该绝对避免以这种方式隐藏。

现在,如果您创建一个具体的 class,请说:

public class Decorator : DecoratorBase<Control>
{
    public override SetFields(Control param) {}
}

你有类型安全:参数现在 必须 Control,至少对于这个具体实现是这样。您可以定义具有不同类型的其他实现,并继承相同的基方法。

请参阅 this question 以简单了解如何使用泛型。