【发布时间】:2018-05-18 13:53:10
【问题描述】:
我需要创建一个接受 3 个输入的服务,基本上可以归结为 A、B,以及 A 和 B 的组合,我们将其称为 C。
假设这些类定义如下:
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; }
}
A 和 B 中的 Fees 是不同的和独立的,并且可以是不同的,对于像 C 这样的情况,您可以在同一个请求中组合使用 A 和 B .
我们目前只有一个如下所示的类:
public class C
{
public A A { get; set; }
public B B { get; set; }
}
但是,这使得更新两者中的任何共同值变得非常烦人。例如:
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;
我们希望能够做这样的事情:
c.DateCreated = DateTime.Now;
//later
var createdDate = c.A.DateCreated; //points to date created before
这样做的天真方法是实现 setter 并使用值更新两个内部类,但是我们如何处理 getter 呢?
另外,C 是否应该继承自 InputBase,因为它在技术上是服务的输入?
解决这个问题的正确方法是什么?
【问题讨论】:
-
您要求保留单独的实例,但希望它们组合成一个实例。
Fee是唯一具有不同的字段还是对象中有其他东西使它们不同? -
还有其他的,我只是用了一个字段来保持简洁。
-
我在您的设计中感觉到强烈的代码气味。如果您想同时发送
A和B,您应该发送IEnumerable<InputBase>。如果某些属性需要具有相同的值,那么如何将它们一起操作是一个不同的问题,并且可以通过公开方法的辅助类来解决,例如AddInputBase和SetDateCreated。 -
A和B都是可设置的,它们的DateCreated属性也是可设置的,这意味着您不能保持它们的DateCreated属性同步。您可以按照答案中的建议同时设置它们,但是任何一个都可以独立更改或替换为另一个实例。当您确实无法确保它们同步时,尝试确保它们同步似乎很奇怪。 -
@GhostCat 谢谢。这个问题看起来就像一个没有付出任何努力的家庭作业问题。你说得对,我不应该把它投票为需要编辑。我不知道处理这种情况的正确方法是什么。
标签: c# .net inheritance composition