2017-10-19 37 views
0

對不好的標題感到難以縮小這個問題的相關性。在單獨的基類中自動將調用強制轉換爲基類變量

我有兩個基本上並行構建的類層次結構:對於BaseObject的每個子類型,都有一個BaseUIObject的子類型。具體原因是因爲BaseObjects實際上是腳本化對象(unity),所以我使用另一組類來表示這些腳本對象之一的每個實例。

示例代碼:

public abstract class BaseUIObject { 
     public BaseObject someObject; 

     public void Setup(BaseObject baseObject) 
     { this.baseObject = baseObject; } 
    } 

    public class SomeUIObject : BaseUIObject { 
     public void Setup(SomeObject someObject) 
     { base.Setup(someObject); SomeUIObjectSpecificRoutine(); } 

     private void SomeObjectSpecificRoutine() { 
      someObject.doSubClassFunction(); 
     } 
    } 

當通過類型SomeObject的目的是SomeUIObject的安裝程序時,就變成存儲爲BaseObject代替SomeObject。有沒有乾淨的方法來防止這種情況發生?

現在我有兩個選擇是要麼在BaseUIObject的每個子類中定義someObject變量,要麼每次在SomeUIObject的方法中使用它時顯式強制轉換(SomeObject)someObject。這些方法都不是很乾淨,我覺得必須有一些更好的方法來使用繼承來實現這一點。

感謝您的任何幫助。

回答

1

似乎是泛型的好地方對我說:

public abstract class BaseUIObject<T> where T : BaseObject 
{ 
    public T theObject { get; private set; } 

    public virtual void Setup(T baseObject) 
    { 
     this.theObject = baseObject; 
    } 
} 

,然後在你的具體的UI對象:

public class SomeUIObject : BaseUIObject<SomeObject> 
{ 
    public override void Setup(SomeObject someObject) 
    { 
     base.Setup(someObject); 
     SomeUIObjectSpecificRoutine(); 
    } 
    // rest of concrete class code... 
} 
+0

完美 - 這正是我之後我,但缺乏知識能夠正常使用谷歌。感謝您的快速回復,會看到這是否有效。 – Cerzi

+0

在SomeUIObject的類型/名稱空間的Setup()arg中找不到類型T的問題。 我也許應該注意到,BaseUIObject本身從另一個類繼承,所以其實際的定義是: 公共抽象類BaseUIObject :OtherBaseClass其中T:BaseObject – Cerzi

+0

T型是你使用的繼承聲明的類型。你的代碼現在如何? –