2016-01-20 52 views
0

我相對新手到C#編程。我想創建抽象基類,它包含一些abstractvirtual方法。ClassName <Type>或ClassName <Object>抽象基類

通過以下兩個示例,它們在使用方面有哪些區別,哪些更常用?

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

對不起,如果這個問題對你來說太天真了。謝謝。

+9

這些都是類型參數的絕對*可怕*名稱。我想也許你不明白泛型是(什麼)。 –

+0

這兩種形式都是一樣的。問題是@KirkWoll說的。在類型參數中,您只需提供一個引用名稱,以便稍後可以參考。請先閱讀:https://msdn.microsoft.com/en-us/library/512aeb7t.aspx –

回答

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代表,而不是命名類型Type和參數T未知類型T。你做什麼這種做法被稱爲'隱藏',也就是說,當你使用TypeObject時,它會爲這些詞賦予新的含義。你絕對應該避免以這種方式隱藏。

現在,如果你創建一個具體類,說:

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

你有類型安全:該參數現在是一個Control,至少在這個具體實施。您可以定義不同類型的其他實現,並繼承相同的基本方法。

有關如何使用泛型的簡單理解,請參見this question

+2

添加到您的答案。類型參數應該有其他名稱,而不僅僅是'T'。例如,如果你的類型參數有一個類型約束,那麼試着通過名稱來推斷它,通常是個好主意,例如'TEntity'或'TUser'。這推斷(不需要進一步檢查類)是否存在約束,而「T」意味着可以使用任何類型*。只需確保以'T'爲前綴,出於與用'I'前綴接口相同的原因。 –

相關問題