2012-05-29 57 views
0

C# Accessing a subclass property複製特定屬性 - 查看其他解決方案的方法存在。設計模式在子類

我有一個對象模型,其中每個對象都有一個父對象,我想訪問具有每個對象的特定類型的父屬性。所以例如車輪應擁有Car類型的父母財產。我的猜測是,有一個既定的設計模式來實現這一點(在.NET中)。但是,我還沒有找到這樣的設計我想出了這個樣子的

public class BaseObject<T> where T : BaseObject<T> 
{ 
    private T mParent; 
    protected T Parent 
    { 
     get { return mParent; } 
    } 

    public BaseObject(T parent) 
    { 
     mParent = parent; 
    } 

    public void Save() ... 
    public void Delete() ... 
    public BaseObject<T> Clone() ... 
} 

public class Car : BaseObject<Car> 
{ 
    public Car(Car parent) : base(parent) 
    { 
    } 

    public bool Is4WD() 
    { 
     return true; 
    } 
} 

public class Wheel : BaseObject<Car> 
{ 
    public Wheel(Car parent) : base(parent) 
    { 
    } 

    public float RequiredTirePressure() 
    { 
     return Parent.Is4WD() ? 3.0f : 2.5f; 
    } 
} 

你看到任何設計或性能缺點這種做法?你能推薦一個更好的設計嗎?

+3

你想解決什麼問題?使用泛型非常不簡單。 – jgauffin

+0

我的數據是由一個對象樹與可能這反過來又可能有自己的孩子等子對象要做到這一點每個對象都有它的父級的引用在那裏可以註冊/註銷主要對象。在許多情況下,子對象訪問父對象的方法/屬性。一種方法是將父類屬性從基類型轉換爲正確類型,但我想知道是否有類型安全聲明的方法。 –

+0

Liskovs Substitution Principle說任何接受基類的方法都應該適用於所有不同的子類。你所要求的是違反該原則,因此不是真正的「是」關係。如果你能用真實的類名來說明你的問題,而不是你現在添加的抽象名稱,那會更好。 – jgauffin

回答

3

的答案是使用composition instead of inheritance。車輪不是汽車,所以它不應該從Car延伸。相反,應該讓Wheel採取Car在其構造。

例如:

public class Wheel { 
    private Car car; 

    public Wheel(Car car) { 
     this.car = car; 
    } 

    public float RequiredTirePressure() { 
     return car.Is4WD() ? 3.0f : 2.5f; 
    } 
} 
+0

有道理你在說什麼。我想我心裏想的是[Rockford Lhotka的CSLA .NET框架](http://www.lhotka.net/cslanet/Default.aspx)。他有一個BusinessBase類,它具有一些其他類繼承的基本功能(在我的示例中,Wheel也擴展了BaseObject而不是Car)。父屬性的類型是IParent。你會建議在這種情況下投入IParent到特定類型? –

+0

我會隨你的建議去使用一個具有子對象的特定類型的引用(除了基礎對象中的引用)。然而,我必須承認,我並沒有完全放棄以一種似乎被接受的方式完全拋棄繼承,例如在CSLA .NET框架中。 –