如何将两个具有共同成员的类组合成一个输入?

lda*_*dam 5 .net c# inheritance composition

我需要创建一个服务,它需要3个输入,这基本上归结为A,和我们将调用B的组合.ABC

假设这些类定义如下:

public abstract class InputBase
{
  public bool Option1 { get; set; }
  public decimal Rate { get; set; }
  public DateTime DateCreated { get; set; }
}

public class A : InputBase
{
  public decimal Fee { get; set; }
}

public class B : InputBase
{
  public decimal Fee { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所述Fee以s AB是不同的和独立的,并且可以是不同的,对于像箱子C哪里可以做的组合AB在同一请求中在一起.

我们目前只有一个看起来像这样的类:

public class C
{
  public A A { get; set; }
  public B B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,这使得更新两者中常见的任何值都非常烦人.例如:

var c = new C
{
  A = new A(),
  B = new B()
}

//this is ugly and what we want to avoid
c.A.DateCreated = DateTime.Now;
c.B.DateCreated = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

我们希望能够做到这样的事情:

c.DateCreated = DateTime.Now;
//later
var createdDate = c.A.DateCreated; //points to date created before
Run Code Online (Sandbox Code Playgroud)

这样做的天真方式是实现setter,并使用值更新内部类,但是我们如何处理getter?

另外,应该C继承InputBase,因为它在技术上是服务的输入?

这是怎样的正确方法?

Set*_*ers 0

您可以使 C 派生自 InputBase,并拥有 InputBase 的集合。

public class C : InputBase, IHaveInputBase
{
    IList<InputBase> IHaveInputBase.Inputs { get; set; }
}

public class Service
{
    public void Handle(InputBase inputBase)
    {
        IHaveInputBase haveInputBase = inputBase as IHaveInputBase;

        if (haveInputBase != null)
        {
            foreach (InputBase input in haveInputBase.Inputs) 
            {
                this.Handle(input);
            }
        }

        inputBase.DateCreated = this.dateTimeService.UtcNow();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)