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 A和B是不同的和独立的,并且可以是不同的,对于像箱子C哪里可以做的组合A和B在同一请求中在一起.
我们目前只有一个看起来像这样的类:
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,因为它在技术上是服务的输入?
这是怎样的正确方法?
您可以使 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)
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |