ClassName<Type> or ClassName<Object> for abstract base class
ClassName<Type> or ClassName<Object> for abstract base class
我是 C# 编程的新手。我想创建包含一些 abstract
和 virtual
方法的 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) { }
}
在我的例子中,Type
或 Object
将代表我的商业模式 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',也就是说,当你以你正在做的方式使用Type
或Object
时,它正在分配这些词的新含义。你应该绝对避免以这种方式隐藏。
现在,如果您创建一个具体的 class,请说:
public class Decorator : DecoratorBase<Control>
{
public override SetFields(Control param) {}
}
你有类型安全:参数现在 必须 是 Control
,至少对于这个具体实现是这样。您可以定义具有不同类型的其他实现,并继承相同的基方法。
请参阅 this question 以简单了解如何使用泛型。
我是 C# 编程的新手。我想创建包含一些 abstract
和 virtual
方法的 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) { }
}
在我的例子中,Type
或 Object
将代表我的商业模式 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',也就是说,当你以你正在做的方式使用Type
或Object
时,它正在分配这些词的新含义。你应该绝对避免以这种方式隐藏。
现在,如果您创建一个具体的 class,请说:
public class Decorator : DecoratorBase<Control>
{
public override SetFields(Control param) {}
}
你有类型安全:参数现在 必须 是 Control
,至少对于这个具体实现是这样。您可以定义具有不同类型的其他实现,并继承相同的基方法。
请参阅 this question 以简单了解如何使用泛型。