c# - 在参数 C# 中传递接口(interface)

标签 c# parameters interface

image

传入参数有什么好处?
我们可以从中获得什么?
目的是什么?

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)的抽象类

  • 根据您发布的示例,我们有两个接口(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_BBankAccount_C .除此之外,我们假设每当我们从 A 取款到任何其他账户时,我们都必须收取特定费用并应用一些额外的逻辑。这绝对意味着银行账户 A 应该使用另一个类来建模。我们就叫它BankAccount_A .
    如果我们假设所有这些类 BankAccount_A , BankAccount_BBankAccount_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/

    相关文章:

    c# - 从时区转换后将日期格式更改为 dd/MM/yyyy

    c# - 在.NET Core中使用SHA-1

    c# - 如何仅使用 InvariantCulture 渲染某些特定模型字段,而其余部分继续使用用户区域性?

    c# - 如何避免在不同位置具有相同键/值查询字符串的重复网址?

    vba - 尝试使用 VBA 在 Access 中打开记录集时出现 "Too few parameters error"

    c++ - 我可以用传递给 C++ 函数的形式参数创建 union 吗?

    java - 在 Java 的构造函数中设置参数值

    unit-testing - 模拟 go-logr 并验证它记录的消息?

    java - 实现Comparable接口(interface)的问题

    java - 为什么一个已实现的接口(interface)方法被声明为公共(public)的?