2017-07-07 49 views
0

I need to 2 levels of inheritance and abstraction in master-child relationship是討論的開始。在.net 4.0中繼承對象問題的主 - 子對象設計和通用基類型問題

我想要的是確保所有從BaseMaster繼承的對象都必須有一個子項列表,並且子項的類型必須從BaseChild繼承。根據這個職位,我已經解決我的設計

public abstract class BaseMaster<TChild> where TChild : BaseChild 
{ 
    public Collection<TChild> Children { get; } 
} 

public abstract BaseChild 
{ } 

public class FirstRealMaster : BaseMaster<FirstRealChild> { /* add more properties */ } 

public class FirstChild : BaseChild { /* add more properties */ } 

但是,這樣的設計我失去了使用的基本對象類型來描述繼承對象的能力,因爲BaseMaster<BaseChild> b = new FirstRealMaster();將不會被允許,在技術上也有不同的類型。以下是我希望可以使其工作的示例代碼。

static BaseMaster<BaseChild> ReturnBaseMaster(int i) 
    { 
     if (i == 1) 
     { 
      return new FirstRealMaster(); 
     } 
     else if (i == 2) 
     { 
      return new SecondRealMaster(); 
     } 

     return null; 
    } 

這樣的限制帶來了很多不便。任何建議在這裏如何改進設計,以實現我的目標,我需要對象模型來強制所有繼承類有孩子。同時我仍然希望能夠靈活地爲繼承類型使用基類型?

+0

當我們不知道這些類應該如何協同工作時,設計解決方案有點難。你能不能做一些像「BaseMaster b = new FirstRealMaster();」 – Clay07g

+0

請檢查我的更新後的帖子。 – hardywang

+0

爲什麼你不能只是返回'IMaster '?如果不執行'child'和'master',我不知道你想實現什麼。 – apocalypse

回答

1

我不知道你有什麼要求,但也許這將滿足您的期望:

如果你想添加子
using System.Collections.Generic; 

namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main (string[] args) 
     { 
      IMaster<IChild>   master1 = new ConcreteMaster(); 
      IMaster<BaseChild>  master2 = new ConcreteMaster(); 
      IMaster<ConcreteChild> master3 = new ConcreteMaster(); 
      BaseMaster<ConcreteChild> master4 = new ConcreteMaster(); 
     } 
    } 

    public interface IChild { } 

    public interface IMaster<out T> where T : IChild 
    { 
     IReadOnlyList<T> Children { get; } 
    } 

    public abstract class BaseMaster<T> : IMaster<T> where T : IChild 
    { 
     private readonly List<T> children = new List<T>(); 

     public IReadOnlyList<T> Children => children; 

     public void Add (T child) 
     { 
      children.Add (child); 
     } 
    } 

    public abstract class BaseChild : IChild { } 

    public class ConcreteMaster : BaseMaster<ConcreteChild> { } 

    public class ConcreteChild : BaseChild { } 
} 

注意,你需要使用的基本類型。

+0

請查看我更新的問題。 – hardywang

+0

我會接受你的回答。非常感謝! – hardywang