OOP接口点

lui*_*7up 11 php oop interface multiple-inheritance

可能重复:
接口与抽象类(通用OO)

编辑: 我刚刚阅读了"可能重复"的问题和答案,我觉得有人认为这两个问题甚至相似,我感到非常难过......但是,哦......

-------------------------------------------------- -----------------------

大家好,我试图了解OOP范例中的接口.我知道抽象类和接口之间的区别,我也知道接口基本上允许简单的多继承行为和设计,但我没有得到的是"承诺原则".我的意思是,接口应该是实现接口的类实现所有接口方法的承诺.

我不明白的是,每当我们调用它的方法时,我们是否必须检查类是否实现了与instanceOf的接口?没有阅读文档,你不知道一些类实现接口.如果您阅读代码而不是您可以看到自己已定义了该方法,您可以调用它吗?!

如果我有

案例A.

class Ball{
function kick(){...};
}
Run Code Online (Sandbox Code Playgroud)

或案例B.

interface Kickable{
function kick;
}

class Ball implements Kickable{
function kick(){...};
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是,在A情况下我会在调用一个不存在的方法时遇到错误("在运行时"),如果是B,我会在尝试运行代码时遇到此错误编译".运行时和编译肯定在这里使用错误(PHP环境).

我记得在Java中有一个Runnable接口可以启用线程.为什么我们必须实现一个Runnable接口,然后在该类中定义run()方法?我的意思是,类可以有一个没有实现接口的Run方法,并且有办法检查类是否定义了特殊方法.好吧,也许我的Java部分问题有点令人困惑:)))

对于这样一个令人困惑的问题我很抱歉,但我希望有人在理解中遇到这些问题,现在他可以分享他的结论:)

谢谢,卢卡

Hei*_*bug 2

不,你不必使用instanceof。这是为了运行时类型检查。如果您想确保您使用的类实现了该接口,只需将接口类型放入您的方法签名中即可。例如

public interface yourInterface{
      public void foo();
}

public class yourClass implements yourInterface{
     public void foo(){} //you need to implement this method, otherwise it won't compile
}

public class anotherClass{
     public void bar(yourInterface object){} //you can pass any object to "bar" method if the object implements yourInterface. yourClass object will be fine
}
Run Code Online (Sandbox Code Playgroud)

然后你还可以做一些其他的好事,这取决于你的语言。例如,使用 java,您可以强制泛型类型实现给定的接口,从而允许泛型编程:

class generiClass<T extends yourInterface>{
      public void genericMethod(T object){} //you can use a generic T class, but T needs to implement yourInterface
}
Run Code Online (Sandbox Code Playgroud)

接口的原因主要有2:

  1. 强制一个类实现某些方法
  2. 允许多重继承,就像没有多重继承的语言中的功能一样(在像 C++ 这样的语言中,你有多重继承,你不需要接口。或者更好地说,接口与纯抽象类完全相同)