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 ...
    }
}
4

3 回答 3

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>();
于 2012-04-20T13:36:31.553 回答
2

衙门的回答很好。

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

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
{
}
于 2012-04-20T13:38:37.080 回答
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
}
于 2012-04-20T19:35:56.610 回答