有谁能告诉我哪种设计最适合这种情况?
我的课程名为BasicAccount
,SavingAccount
和CurrentAccount
。
SavingAccount
和CurrentAccount
应具有BasicAccount
的所有功能。稍后我们可能会引入一个名为AdvanceAccount
的新帐户,它应具有CurrentAccount
和SavingAccount
的所有功能。我应该如何设计结构?
我的回答:
让BasicAccount
保持抽象,SavingAccount
也是抽象的,并实现BasicAccount
创建一个界面ICurrentAccount
,currentaccount实现BasicAccount
和ICurrentAccount
,
如果我们有AdvanceAccount
,请使用SavingAccount
和ICurrentAccount
实施。
还有更好的方法吗?我在接受采访时被告知,面试官对我的答案不满意。
答案 0 :(得分:5)
我使用这样的东西:
abstract class BasicAccount {}
interface ISavingAccount {}
interface ICurrentAccount {}
class SavingAccount : BasicAccount, ISavingAccount {}
class CurrentAccount : BasicAccount, ICurrentAccount {}
class AdvanceAccount : BasicAccount, ISavingAccount, ICurrentAccount {}
如果SavingAccount
和CurrentAccount
具有很多功能,您可以在AdvanceAccount
实施中使用汇总:
class AdvanceAccount : BasicAccount, ISavingAccount, ICurrentAccount
{
private readonly SavingAccount savingAccount;
private readonly CurrentAccount currentAccount;
public AdvanceAccount()
{
savingAccount = new SavingAccount(...);
currentAccount = new CurrentAccount(...);
}
// redirect ISavingAccount and ICurrentAccount implemetation
// to savingAccount and currentAccount respectively
}
<强> UPD 即可。
请注意,SavingAccount
中CurrentAccount
和AdvanceAccount
的直接实例化只是一个示例。 IRL你可能会使用IoC容器。
答案 1 :(得分:1)
这是一个经典的钻石问题https://en.wikipedia.org/wiki/Multiple_inheritance
有各种方法可以看待它。最后,它实际上取决于您设计的其他方面。
如果您可以使用服务拆分行为,您应该能够将行为添加/删除到您想要的任何新类中,它们应该只从基本帐户派生,如果它们可以从其他子类派生,那么& #39;奖金......
答案 2 :(得分:0)
我认为装饰器模式比传统继承更适用。
public interface IBasicAccount { }
public interface ISavingAccount { }
public interface ICurrentAccount { }
public interface IAdvanceAccount { }
public class BasicAccount : IBasicAccount { }
public class SavingAccount : ISavingAccount
{
// methods may use basic account internally to delegate some function calls
private readonly IBasicAccount _basicAccount;
public SavingAccount(IBasicAccount basicAccount)
{
_basicAccount = basicAccount;
}
}
public class CurrentAccount : ICurrentAccount
{
private readonly IBasicAccount _basicAccount;
public CurrentAccount(IBasicAccount basicAccount)
{
_basicAccount = basicAccount;
}
}
public class AdvanceAccount : IAdvanceAccount
{
private readonly ISavingAccount _savingAccount;
private readonly ICurrentAccount _currentAccount;
public AdvanceAccount(ISavingAccount savingAccount, ICurrentAccount currentAccount)
{
_savingAccount = savingAccount;
_currentAccount = currentAccount;
}
}
您可以根据需要将调用委托给内部IBasicAccount,ISavingAccount和ICurrentAccount实施。
此外,如果商业模式需要,您可以ISavingAccount
和ICurrentAccount
继承IBasicAccount
。
答案 3 :(得分:0)
除了已经说过的内容之外,如果我们同时不同时需要SavingAccount
和CurrentAccount
个实例,我们可以使用以下内容:
abstract class BasicAccount
{
// .. some implementation here
}
class SavingAccount : BasicAccount { }
class CurrentAccount : BasicAccount { }
class AdvancedAccount<T> where T : BasicAccount
{
private readonly T _instance;
public T AccountToWorkWith { get { return _instance; } }
public AdvancedAccount(BasicAccount instance)
{
this._instance = instance as T;
}
}