哪种设计最适合这种情况?

时间:2015-10-09 06:28:33

标签: c# design-patterns interface abstract-class

有谁能告诉我哪种设计最适合这种情况?

我的课程名为BasicAccountSavingAccountCurrentAccount

SavingAccountCurrentAccount应具有BasicAccount的所有功能。稍后我们可能会引入一个名为AdvanceAccount的新帐户,它应具有CurrentAccountSavingAccount的所有功能。我应该如何设计结构?

我的回答:

  • BasicAccount保持抽象,SavingAccount也是抽象的,并实现BasicAccount

  • 创建一个界面ICurrentAccount,currentaccount实现BasicAccountICurrentAccount

  • 如果我们有AdvanceAccount,请使用SavingAccountICurrentAccount实施。

还有更好的方法吗?我在接受采访时被告知,面试官对我的答案不满意。

4 个答案:

答案 0 :(得分:5)

我使用这样的东西:

abstract class BasicAccount {}

interface ISavingAccount {}
interface ICurrentAccount {}

class SavingAccount : BasicAccount, ISavingAccount {}  
class CurrentAccount : BasicAccount, ICurrentAccount {}  
class AdvanceAccount : BasicAccount, ISavingAccount, ICurrentAccount {}  

如果SavingAccountCurrentAccount具有很多功能,您可以在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 即可。
请注意,SavingAccountCurrentAccountAdvanceAccount的直接实例化只是一个示例。 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实施。 此外,如果商业模式需要,您可以ISavingAccountICurrentAccount继承IBasicAccount

答案 3 :(得分:0)

除了已经说过的内容之外,如果我们同时不同时需要SavingAccountCurrentAccount个实例,我们可以使用以下内容:

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