[DataContract(Name = "jobDateTimeFilterRequest", Namespace = Constants.ManagementNamespace)]
public class JobDateTimeFilterRequest : TimeFrame
{
[DataMember(Name = "jobType")]
public BackgroundJobType JobType { get; set; }
}
[DataContract(Name = "timeFrame", Namespace = Constants.ManagementNamespace)]
public class TimeFrame
{
[DataMember(Name = "from")]
public DateTime From { get; set; }
[DataMember(Name = "to")]
public DateTime To { get; set; }
}
我想使用合成而不是继承。 要做到这一点,我需要创建:
[DataContract(Name = "jobFilterRequest", Namespace = Constants.ManagementNamespace)]
public class JobFilterRequest
{
[DataMember(Name = "jobType")]
public BackgroundJobType JobType { get; set; }
}
JobDateTimeFilterRequest
将是这样的:
[DataContract(Name = "jobDateTimeFilterRequest", Namespace = Constants.ManagementNamespace)]
public class JobDateTimeFilterRequest
{
[DataMember(Name = "jobType")]
public JobFilterRequest JobFilter { get; set; }
[DataMember(Name = "timeFrame")]
public TimeFrame TimeFrame{ get; set; }
}
我是对的?或者是对构图的错误理解?
答案 0 :(得分:2)
“基于继承的组合”原则通常适用于具有行为的对象,而不是简单的数据结构。原因是,它使用新的功能扩展系统变得更容易。相反,仅引入新数据并不会改变系统本身。
在您的情况下,只要您不覆盖属性并且它们仍然是公共自动属性,继承TimeFrame
可能与拥有TimeFrame
一样好。
答案 1 :(得分:1)
一般来说,你是对的。您已将基类的实例放在派生类的状态中。但是你不应该忘记封装,在当前的实现中,有可能获得JobDateTimeFilterRequest
对象的不一致状态,例如通过设置TimeFrame
null。考虑一下它在业务逻辑中所依赖的对象的一致状态。我不知道您的业务逻辑,但您的情况可以通过例如使用TimeFrame
属性的私有setter的构造函数参数来完成。请注意,我们讨论的是一般情况,但有WCF
逻辑可能会被private
修饰符破坏
可能会是这样的(我忽略了WCF
属性和逻辑):
public class JobDateTimeFilterRequest
{
public JobFilterRequest JobFilter { get; set; }
public TimeFrame TimeFrame{ get; private set; }
public JobDateTimeFilterRequest(TimeFrame timeFrame)
{
this.TimeFrame = timeFrame;
}
}