簡體   English   中英

班級名稱 <Type> 或ClassName <Object> 用於抽象基類

[英]ClassName<Type> or ClassName<Object> for abstract base class

我是C#編程的新手。 我想創建一個包含一些abstractvirtual方法的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) { }
}

就我而言, TypeObject將代表我的業務模型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 什么做的是被稱為“隱藏”,也就是說,當你使用TypeObject在你正在做的方式,它被賦予了新的含義,這些話。 您應該絕對避免以這種方式隱藏。

現在,如果您創建一個具體的類,請說:

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

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

這個問題對於如何使用泛型一個簡單的了解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM