2012-04-20 47 views
4

我有兩個類(這是C#),它們非常相似,除了它們都包含它們自己的嵌套類和枚舉。減少具有不同嵌套類的兩個類中的代碼重複

我想重構他們都從一個抽象類繼承,但我遇到了一個問題,因爲這些方法都緊密耦合到嵌套的類類型。

我的第一個計劃是提取ItemDetails類,但它鏈接到ItemType,它是一個特定於每個視圖項目類的枚舉。此外,我不能僅僅使用System.Enum作爲類型,因爲我需要能夠將細節序列化爲一個xml文件。

我該如何減少這些類中的重複?

public class FirstViewItem 
{ 
    [Serializable] 
    public class ItemDetails 
    { 
     public ItemType Type; 
     public int Width; 
     public string Text; 
     public int DisplayOrder; 
    } 

    public enum ItemType 
    { 
     None = 0, 
     A, 
     B, 
     C 
    } 

    public FirstViewItem() 
    { 
     // ... 
    } 

    public List<ItemDetails>() 
    { 
     // code here ... 
    } 
} 

public class SecondViewItem 
{ 
    [Serializable] 
    public class ItemDetails 
    { 
     public ItemType Type; 
     public int Width; 
     public string Text; 
     public int DisplayOrder; 
    } 

    public enum ItemType 
    { 
     None = 0, 
     X, 
     Y, 
     X 
    } 

    public SecondViewItem() 
    { 
     // ... 
    } 

    public List<ItemDetails>() 
    { 
     // code here ... 
    } 
} 
+1

這可能是更適合於[代碼審查(http://codereview.stackexchange.com/)... – 2012-04-20 13:37:06

+0

我甚至不知道存在...好! – chills42 2012-04-20 19:22:12

回答

5

你想使一個通用類,它是依賴於項目類型枚舉中傳遞:

public class ViewItem<T> 
{ 
    [Serializable] 
    public class ItemDetails 
    { 
     public T Type; // the generic type is inserted here 
     public int Width; 
     public string Text; 
     public int DisplayOrder; 
    } 

    // common code that uses ItemDetails 
} 

那麼一些項目類型:

public enum FirstItemType 
{ 
    None = 0, 
    A, 
    B, 
    C 
} 

public enum SecondItemType 
{ 
    None = 0, 
    X, 
    Y, 
    Z 
} 

然後用法:

var firstViewItem = new ViewItem<FirstItemType>(); 
+0

我保留了單獨的類,但是修改了泛型類,因爲您已經顯示它也是抽象的並且從中繼承。 – chills42 2012-04-20 19:27:23

2

衙門的回答r是好的。

我開始寫這個,所以我會完成。下面是一個使用泛型與基類的例子,一些繼承類:

public class BaseClass<T> 
{ 
    public T NestedClass{get;set;} 
} 

public class MainOne : BaseClass<MainOneType> 
{ 
} 

public class MainTwo : BaseClass<MainTwoType> 
{ 
} 

public class MainOneType 
{ 
} 

public class MainTwoType 
{ 
} 
+0

+1,這些都是很好的例子,可能與原始問題非常相關。 – yamen 2012-04-20 13:39:59

+0

我結束了這個和@yamen的結合。 – chills42 2012-04-20 19:25:20

0

我結束了使用的想法來自2分不同的答案,所以我會綜合作用的結果回答。

public class BaseViewItem<T> where T : struct 
{ 
    [Serializable] 
    public class ItemDetails 
    { 
     public T Type; 
     public int Width; 
     public string Text; 
     public int DisplayOrder; 
    } 

    public FirstViewItem() 
    { 
     // ... 
    } 

    public List<ItemDetails>() 
    { 
     // code here ... 
    } 
} 

public class FirstViewItem : BaseViewItem<FirstItemType> 
{ 
    // class-specific code... 
} 

public class SecondViewItem : BaseViewItem<SecondItemType> 
{ 
    // class-specific code... 
} 

public enum FirstItemType 
{ 
    None = 0, A, B, C 
} 

public enum SecondItemType 
{ 
    None = 0, X, Y, Z 
}