减少具有不同嵌套类的两个类中的代码重复

时间:2012-04-20 13:33:35

标签: c# enums refactoring xml-serialization

我有两个非常相似的类(这是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 ...
    }
}

3 个答案:

答案 0 :(得分: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>();

答案 1 :(得分:2)

Yamen的答案很好。

我开始写这个,所以我会完成。下面是使用泛型与基类和一些继承类的示例:

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
{
}

答案 2 :(得分: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
}