接口如何解决钻石问题

Usm*_*lid 3 c# oop diamond-problem

我需要和你讨论一件事.我一直在阅读有关接口的信息,它是类之间的契约接口,该类将提供接口的所有方法的实现.为了解决着名的钻石问题,我们有接口.喜欢(我正在使用C#)

public interface IAInterface
{
     void aMethod();
}

public interface IBInterface
{
     void aMethod();
}
Run Code Online (Sandbox Code Playgroud)

现在

public class aClass : IAInterface, IBInterface
{
     public void aMethod()
     {

     }
}    
Run Code Online (Sandbox Code Playgroud)

通过上面的代码,据说aClass提供了接口方法的实现.我的困惑是:如果它是类和接口之间的契约,那么我们怎么能说与两个接口的契约都得到满足呢?

一个现实世界的例子,就像我与杰克签订合同,我将同时给他5美元我也与Ben签订合同,我将给他5美元,现在通过向他们中的一个提供5美元(杰克或本)我怎么能说我已经履行了与他们两人的合同?

我的问题看似幼稚,但这让我很困惑.

npi*_*nti 10

接口保证将实现一组给定的方法.该接口不关心如何实现代码.与扩展类相反,当您扩展类时,您正在使用一些预定义的代码.

如果使用相同的方法扩展两个类,比如说,methodA并调用此方法,那么编译器将不知道它需要运行哪个类.另一方面,当您使用相同的方法实现两个接口时,由于实现是在您自己的代码中编写的,因此编译器将知道在何处需要查找实现.

所以基本上,当你实施某些东西时,你保证会提供一些服务.

编辑:我会尝试并以一些面向对象的方式转换它,希望能让事情变得更加清晰.

杰克和本将保证他们会借给你钱,另一方面,你保证会偿还,所以,从OO的角度来看,你可以这样看:

public interface IPay
{
    public void Pay(Individual i);
}

public class MySelf : IPay
{
    public void Pay(Individual i)
    {
        ...
    }
}

public interface ILend
{
    public void Lend(Individual i);
}

public class Jack : ILend //Same applies for Ben
{
    public void Lend(Individual i)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我要解决你指定的问题的方法.

至于其他垃圾示例,您可以这样做:

public interface ITakeTrash
{
    public void TakeTrash(Trash t);
}

public Son : ITakeTrash
{
    public void TakeTrash(Trash t);
}

public class Mum  //Same applies for dad
{
    Son mySon = ...

    mySon.TakeTrash(t);
}
Run Code Online (Sandbox Code Playgroud)

你的母亲和父亲都不知道如何处理垃圾,但是,他们知道知道如何处理它,这就是他们关心的事情(就像上面一样,你只关心Ben和Jack可以给你金钱和其他各方只关心你可以还钱,没有人真正关心你如何做到这一点.

我确实理解你要去哪里,基本上说如果我实现两个不同的接口与具有相同名称的方法做不同的事情.如果你最终遇到这种情况,我认为这可能是由于糟糕的设计.我不建议建立一个能完成各种不同事情的单一课程,这也是其中一个原因.

另一方面,您可能会问,如果我有2个接口使用相同名称的方法做类似的事情怎么办?然后,我认为答案是,因为接口类似的事情,并且你有相同名称的方法,所以很可能你正在做同样的事情,因此,你不必混淆自己.

我希望这个编辑有助于解决这个问题.


Lue*_*eTm 5

实施好方法不像给钱。这就像倒垃圾一样。如果你答应爸爸妈妈倒垃圾,倒一​​次垃圾就够了。