我遇到了一些困境,并希望得到一些意见。
我有这个类,让我们称它为“Car”,其中每个实例都有一些单独的设置(通过属性),如“Color”,“HasGearShift”或诸如此类(我正在为一个简单的例子做这个)。这些应该是用户可自定义的,但也应该有默认值。
因此,自然的解决方案是获取所有“设置”属性并将它们分解为可以序列化/反序列化的单独“设置”类。每个Car类还可以继承Settings类,其中一个类设置默认值,并且可以序列化为用户自定义的基础。 Sofar很好。
我觉得问题是我要么必须在整个代码中使用这种语法:someCar.Settings.HasGearShift
还有一些像这样:someCar.Settings.GearBox.CurrentGear
但是至少没有冗余,一切都是很好地封装在Settings类中。
另一个选项是将属性保留在Car类上,只需将它们从Settings类复制到类中即可。然后我可以再简单地写someCar.HasGearShift
。使引用属性更简洁,但意味着如果我添加/删除某些内容,我必须更改两个类中的设置。
你会选择哪一个,或者我错过了第三个更好的方法?我倾向于第二种选择,否则代码中只会出现太多“火车残骸”:)
答案 0 :(得分:6)
我想我会在两者之间寻找一些东西:使用合成并使用所需的设置制作CarSettings类,并使其可序列化。也许有一个静态的CarSettings.Default属性;它定义了默认设置。然后Car可以在构造函数中获取设置实例,并公开设置的委托属性,这些属性需要在外部可见。
有些事情:
public class Car
{
private CarSettings settings;
public Car(CarSettings settings)
{
settings = settings ?? CarSettings.Default;
}
public string Color { get {return settings.Color;} }
}
public class CarSettings
{
public string Color {get; private set;}
public static CarSettings Default = new CarSettings {Color = "Red"};
}
答案 1 :(得分:0)
您可以查看Visual Studio Win-forms设计器使用的现有设计:
Public Property AlternateItemColors() As Boolean Implements AbstractInterfaces.CoreControls.IVisualList.AlternateItemColors
Get
Return m_AlternateItemColors
End Get
Set(ByVal value As Boolean)
m_AlternateItemColors = value
End Set
End Property
Public Overridable Function ShouldSerializeAlternateItemColors() As Boolean
If Me.AlternateItemColors = True Then Return False
Return True
End Function
他们也使用了许多属性,比如;的默认值强>
答案 2 :(得分:0)
我不确定我在这里看到问题。似乎你唯一的问题是你不喜欢深层嵌套的属性。这不是一个真正的问题,当您需要访问设置时,您可以轻松地在代码中执行此操作:
var settings = someCar.Settings;
settings.Color...
我想说的是,你的设计似乎很好,你担心的长语法不是问题。