2010-04-11 118 views
2
public abstract class Request 
{ 
    public class Parameters 
    { 
     //Threre are no members here 
     //But there should be in inherited classes 
    } 

    public Request() 
    { 
     parameters = new Parameters(); 
    } 

    public Parameters parameters; 
} 

兩個問題:C#中抽象子類的基類?

  1. 我怎麼做,所以我可以添加的東西到構造但原來構造仍然會執行?

  2. 我該如何使它成爲子類可以將成員添加到參數類?

+0

嗯...我不知道如何正確地說出問題 – 2010-04-11 20:17:38

+0

我和你在#2。你能再解釋一下嗎?你是否試圖離開修改,但可以擴展? – 2010-04-11 20:21:01

+0

如果這是針對JSON處理,如下所述,爲什麼即使有一個強類型的參數對象呢?只需將所有參數粘貼在IDictionary中。無論如何,參數只是一個數據傳輸對象,它不會有任何行爲。 – 2010-04-11 21:22:36

回答

7

如果你正在做什麼,我想你,你就必須稍微改變你的構造:

public Request(Parameters parameters) { 
    this.Parameters = parameters; 
} 

,然後你可以這樣做:

public class SpecificRequest : Request { 
    public class SpecificRequestParameters : Request.Parameters { 
    } 
    public SpecificRequest() : base(new SpecificRequestParameters()) { 
    //More stuff here 
    } 
} 

有什麼具體你正試圖解決的問題?你在這裏做什麼似乎相當尷尬和過於複雜。

+0

實現JSON通信。我希望這可以使用數組完成。 Grrrrr ....我討厭它 - 我有大約20個類爲每個請求和20多個相應的答覆:( – 2010-04-11 20:26:18

+0

你可能會考慮使用類似JSon.Net? – flq 2010-04-11 20:29:33

+0

我使用JSON.NET - 我將序列化JSON對象到類 – 2010-04-11 20:30:36

1

爲什麼要在Request類中嵌入Parameters類?相反,讓Request有一個參數實例,並在其他地方聲明該類。

回答你的問題1: 繼承Request,並始終調用原始的請求構造函數。

問題2: 子類不能將成員添加到參數類(除了使用反射,但不想走該路徑)。你可以做的最好的是從參數繼承,並讓InheritedRequest使用InheritedParameter類。請注意,在這種情況下,您無法重寫屬性和屬性。您必須在InheritedRequest中有一個名爲InheritedParameters類型的AdditionalParameters的附加屬性。

1

構造可以與語法鏈接

ctor() : this() 

ctor() : base() 

在那裏,你可以轉嫁給等參數

使參數現場泛型

abstract class Request<T> where T : Parameters { 
    T Parameters; 
} 

class Specialized : Request<SpecialParameters> { 
} 

其中SpecialParameters繼承自Parameters