抽象基类的ClassName <type>或ClassName <object>

时间:2016-01-20 16:31:32

标签: c# abstract-class

我是C#编程的新手。我想创建包含一些virtualType方法的抽象基类

通过以下两个例子,它们的使用差异和更常用的是什么?

示例-1,使用public abstract class DecoratorBase<Type> : ValidatableBindableBase { public virtual void SetFields(Type T) { } public virtual void SetFieldsBack(ref Type T) { } } 关键字。

Object

示例-2,使用public abstract class DecoratorBase<Object> : ValidatableBindableBase { public virtual void SetFields(Object T) { } public virtual void SetFieldsBack(ref Object T) { } } 关键字。

Type

就我而言,Object或{{1}}代表我的商业模式 POCO 类。

对不起,如果这个问题听起来很天真。感谢。

1 个答案:

答案 0 :(得分:6)

不要那样做!

看起来你对泛型有点困惑。当您定义一个通用的抽象类型(在名称后使用<>)时,您告诉编译器“我会给你一些类型,但我不知道刚才是哪种类型。稍后使用我给你的名字作为该类型的占位符。“惯例是使用大写T

例如,以下定义了一个通用的抽象类。

public abstract class SomeClass<T> {}

稍后,当我们创建派生类时,我们使用类型

创建它

public class ConcreteClass : SomeClass<int> {}

如果我们在抽象类中声明了使用类型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 所做的事情被称为“隐藏”,也就是说,当您按照自己的方式使用TypeObject时,它会为那些人赋予新的含义话。你应该绝对避免以这种方式隐藏。

现在,如果你创建一个具体的类,请说:

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

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

有关如何使用泛型的简单理解,请参阅this question