如何正确使用构图?

时间:2015-09-07 12:23:14

标签: c# design-patterns

[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; }
}

我是对的?或者是对构图的错误理解?

2 个答案:

答案 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;
    }
}