抽象基类的ClassName <Type>或ClassName <Object>

Ste*_*ung 0 c# abstract-class

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

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

例1,使用Type关键字.

public abstract class DecoratorBase<Type> : ValidatableBindableBase
{
    public virtual void SetFields(Type T) { }
    public virtual void SetFieldsBack(ref Type T) { }
}
Run Code Online (Sandbox Code Playgroud)

例2,使用Object关键字.

public abstract class DecoratorBase<Object> : ValidatableBindableBase
{
    public virtual void SetFields(Object T) { }
    public virtual void SetFieldsBack(ref Object T) { }
}
Run Code Online (Sandbox Code Playgroud)

在我的情况下,TypeObject将代表我的商业模式POCO类.

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

Dre*_*dan 6

拜托,不要那样做!

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

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

public abstract class SomeClass<T> {}

稍后,当我们创建派生类时,我们使用以下类型创建它:

public class ConcreteClass : SomeClass<int> {}

如果我们在抽象类中声明了使用该类型的方法T,那么new ConcreteClass将替换对Twith的引用int.所以在你的情况下,你应该这样做:

public abstract class DecoratorBase<T> : ValidatableBindableBase
{
    public virtual void SetFields(T param) { }
    public virtual void SetFieldsBack(ref T param) { }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处看到,T表示未知类型T,而不是命名类型Type和参数T.你什么做的是被称为"隐藏",也就是说,当您使用Type或者Object你正在做的方式,它被赋予了新的含义,这些话.你应该绝对避免以这种方式隐藏.

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

public class Decorator : DecoratorBase<Control>
{
    public override SetFields(Control param) {}
}
Run Code Online (Sandbox Code Playgroud)

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

有关如何使用泛型的简单理解,请参阅此问题.

  • 添加到您的答案.Type-params有时应该有其他名称而不仅仅是`T`.例如,如果你的类型参数有一个类型约束,那么通常最好通过名称来推断它,例如`TEntity`或`TUser`.这推断(不需要进一步检查类)有一个约束,而`T`意味着你可以使用*任何类型*.只需确保在前面添加`T`,原因与前缀为'I`的接口相同. (2认同)