2015-05-19 55 views
1

我們有一系列的類,這是從一個共同的類派生:鑄造類和設置共同的社會價值觀

public class OurBaseClass 
{ 
    public string StatusMessage { get; set;} 
    [other properties] 
} 

public class ProcessClass : OurBaseClass 
{ 
    public string SomeProcessInformation { get; set;} 
    public string SomeMoreProcessInformation { get; set;} 
    [other properties] 
} 

我們則試圖建立一個單一的功能設置SpecificProcessClass和電流的基本屬性有(其中不工作):

public object DefaultResponse(string messageText) 
{ 
    return new OurBaseClass 
    { 
     StatusMessage = messageText, 
     [other properties] = ... 
    } 
}; 

的意圖,我們可以有

ProcessClass resp = (ProcessClass) DefaultResponse("Some Message"); 
resp.SomeProcessInformation = ""; 
resp.SomeMoreProcessInformation = ""; 
[other properties] = ... 
return resp; 

推理的目的是爲了最大限度地減少重複編碼的數量,並使得功能易於閱讀(通過眼睛);這是爲以下內容拋出一個錯誤。

System.InvalidCastException: Unable to cast object of type 'OurBaseClass' to type 'ProcessClass' 

雖然在結果不完全感到意外,因爲ProcessClass從OurBaseClass衍生,我會認爲這是可能做到這一點,只是不知道如何...

+0

這是不可能蒙上了基類的一個實例(少特定的類)派生類的一個實例(更具體的類),因爲派生類可以/應該具有比基類更多的功能。另一種方式工作得很好,您可以將派生類的實例轉換爲基類的實例。 –

回答

5

你不能從一個不太派生類型強制轉換爲更多的派生類型,你需要創建一個擺在首位多個派生型。

一種解決方案類似於您當前的代碼使用泛型:

public T DefaultResponse<T>(string messageText) 
    where T : OurBaseClass, new() 
{ 
    return new T 
    { 
     StatusMessage = messageText, 
    }; 
} 

where約束限制TOurBaseClass或派生類型,和new()意味着T必須有一個參數構造。你可以閱讀更多關於他們in the documentation

它可以用於像這樣:

ProcessClass resp = DefaultResponse<ProcessClass>("Some Message"); 
resp.SomeProcessInformation = ""; 
resp.SomeMoreProcessInformation = ""; 
0

如何創建方法在基類中設置公共屬性,然後在每個調用基本方法的子類中使用可以重寫的虛方法。

public class OurBaseClass 
{ 
    public string StatusMessage { get; set;} 
    // other properties 

    protected void BaseInit() 
    { 
     // Set common properties here... 
    } 

    public virtual void Init() 
    { 
     BaseInit(); 
    } 

} 

public class ProcessClass : OurBaseClass 
{ 
    public string SomeProcessInformation { get; set;} 
    public string SomeMoreProcessInformation { get; set;} 

    public override void Init() 
    { 
     BaseInit(); 

     // Set specific properties here... 
    } 
}