ClassName 或 ClassName 用于抽象基类

本文关键字:ClassName 抽象 基类 用于 Type Object | 更新日期: 2023-09-27 18:31:14

我对C#编程比较陌生。我想创建包含一些abstractvirtual方法的抽象基类

通过以下两个示例,它们的用法有何区别,哪个更常用?

示例 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类。

对不起,如果这个问题对你来说听起来很幼稚。谢谢。

ClassName<Type> 或 ClassName<Object> 用于抽象基类

请不要那样做!

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

例如,下面定义了一个泛型抽象类。

public abstract class SomeClass<T> {}

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

public class ConcreteClass : SomeClass<int> {}

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

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,至少对于这个具体的实现。您可以定义具有不同类型的其他实现,并继承相同的基方法。

请参阅此问题,以简单了解如何使用泛型。

相关文章: