![](/img/trans.png)
[英].Net 4.0 Unable to cast object of type 'System.Collections.Generic.List`1[ClassName]' to type 'ClassName'
[英]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類。
抱歉,這個問題對您來說太幼稚了。 謝謝。
拜托, 不要那樣做!
您似乎對泛型有些困惑。 定義通用抽象類型時(在名稱后使用<
和>
),您會告訴編譯器“我會給您一些類型,但我現在不知道是哪種類型。請使用我為您提供的名稱稍后用作該類型的占位符。” 慣例是使用大寫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
什么你做的是被稱為“隱藏”,也就是說,當你使用Type
或Object
在你正在做的方式,它被賦予了新的含義,這些話。 您應該絕對避免以這種方式隱藏。
現在,如果您創建一個具體的類,請說:
public class Decorator : DecoratorBase<Control>
{
public override SetFields(Control param) {}
}
你有類型安全:該參數現在已經是一個Control
,至少在這個具體實施。 您可以定義具有不同類型的其他實現,並繼承相同的基本方法。
見這個問題對於如何使用泛型一個簡單的了解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.