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