interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance { get; }
}
interface ITransferBankAccount : IBankAccount
{
bool TranferTo(IBankAccount destination, decimal amount);
}
class CurrentAccount : ITransferBankAccount
{
public bool TranferTo(IBankAccount destination, decimal amount)
{
bool result;
result = Withdraw(amount);
if (result)
{
destination.PayIn(amount);
}
return result;
}
public decimal Balance
{
get
{
throw new NotImplementedException();
}
}
public void PayIn(decimal amount)
{
throw new NotImplementedException();
}
public bool Withdraw(decimal amount)
{
throw new NotImplementedException();
}
演示代码显示此技术
提前致谢
最佳答案
你实现了一个原则,说
Program to an interface, not an implementation.
GoF 在其名为 Design Patterns 的开创性著作中介绍了这一点。 .坚持这种做法的好处如下:
根据您发布的示例,我们有两个接口(interface):
interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance { get; }
}
interface ITransferBankAccount : IBankAccount
{
bool TranferTo(IBankAccount destination, decimal amount);
}
接口(interface)IBankAccount
由每个银行账户应该具有的两种方法和一个属性组成(至少从这个接口(interface)的作者和她/他试图解决的问题的角度来看)。具体来说,我们应该能够从银行账户存款(
PayIn
)和取款(Withdraw
),最后但并非最不重要的是读取账户余额Balance
。 .关于第二个接口(interface),
ITransferBankAccount
这表现出只有某些帐户可能具有的行为。这种行为是转账。我们可以假设有两种银行账户,一种是您可以将钱从一个银行账户转移到另一个银行账户,另一种是您不能,您只能从该特定银行账户存款/取款。这只是与她/他试图解决的这些接口(interface)的作者的这个特定问题相关的假设,甚至在我们前往
CurrentAccount
之前接口(interface)的好处在第二个接口(interface)中显而易见!我们定义了一种行为,即转账和我们不要需要
TranferTo
方法的第一个参数是自定义类型,如 CurrentAccount
或其他类型。我们只要求这个方法的第一个参数应该实现接口(interface)IBankAccount
.只是这个 !这足以让我们转移一些钱,因为我们可以使用 PayIn
将钱存入帐户。方法。Why the latter is important?
例如,假设我们有 3 个银行账户 A、B、C。此外,我们假设账户 B 和账户 C 在业务方面是不同的。例如,每当账户 B 收到一笔钱时,如果我们将其与账户 C 进行比较,我们应该做一些额外的操作。这意味着为了对此进行建模,我们应该有两个不同的类。
BankAccount_B
和 BankAccount_C
.除此之外,我们假设每当我们从 A 取款到任何其他账户时,我们都必须收取特定费用并应用一些额外的逻辑。这绝对意味着银行账户 A 应该使用另一个类来建模。我们就叫它BankAccount_A
.如果我们假设所有这些类
BankAccount_A
, BankAccount_B
和 BankAccount_C
实现接口(interface)IBankAccount
和类(class)BankAccount_A
实现接口(interface)ITransferBankAccount
,那么您可以编写如下代码:var bankAccountA = new BankAccount_A();
// Deposit $100 in Bank Account A
bankAccountA.PayIn(100);
var bankAccountB = new BankAccount_B();
var bankAccountC = new BankAccount_C();
// Transfer $ 60 to bank account B from A
bankAccountA.TransferTo(bankAccountB, 60);
// Transfer $ 40 to bank account B from A
bankAccountA.TransferTo(bankAccountC, 40);
假设现在你没有遵循这个原则,你想实现上面的功能。在这种情况下,您应该在类 BankAccount_A
中定义了两个方法。 .一种用于将资金转移到使用 BankAccount_B
创建的银行帐户的方法。另一个用于将资金转移到使用 BankAccount_C
创建的银行帐户中。 .如果您将来对另一个帐户 D 有另一个要求怎么办?你应该定义另一种方法等等......这次你应该违反SOLID的原则之一。 ,开放/封闭原则,软件实体……应该对扩展开放,但对修改关闭。如果我们使用了我们已经关闭进行修改的界面:)。
关于c# - 在参数 C# 中传递接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46387187/