可能重复:
Interface vs Abstract Class (general OO)
编辑:,我刚刚阅读了“可能重复”中的问题和答案,我感到非常难过,因为有人认为这两个问题甚至相似……但是,哦,嗯..。
-------------------------------------------------------------------------
大家好,我想了解OOP范式中的接口。我知道抽象类和接口之间的区别,我也知道接口基本上允许简单的多重继承行为和设计,但我没有得到的是“承诺原则”。我的意思是,接口应该是一个承诺,一个实现接口的类拥有实现的所有接口方法。
我不明白的是,每次调用instanceOf方法时,我们是否都必须检查类是否实现了与它的接口?如果不阅读文档,您就不知道某些类实现了接口。如果您阅读了代码,那么您可以看到自己已经定义了该方法,您可以调用它吗?!
如果我有
案件A。
class Ball{
function kick(){...};
}或案件B。
interface Kickable{
function kick;
}
class Ball implements Kickable{
function kick(){...};
}唯一的区别是,在A种情况下,当调用一个不存在的方法(“在运行时”)时,我会得到一个错误,而在B种情况下,我将在尝试“编译”的同时运行代码时得到这个错误。运行时和编译在这里肯定使用错误(PHP环境)。
我记得在Java中有一个可运行的接口,它支持线程处理。为什么我们必须实现一个接口Runnable,然后在该类中定义run()方法?我的意思是,类可以有一个Run方法,而不需要实现一个接口,还有一些方法可以检查类是否定义了一个特殊的方法。好吧,也许我的Java部分有点让人困惑:))
对于这样一个令人困惑的问题,我很抱歉,但我希望有人在理解这些问题时经历了这些问题,现在他可以分享他的结论:)
谢谢你,卢卡
发布于 2011-05-13 13:08:49
您已经在您的问题中指定了接口的大部分优点,即:
您还提到,您知道抽象类和接口之间的区别。因此,使用接口的另一个好处是:
派生。
这基本上是上面第一点的重新哈希,但是它把它放在了一个您以前可能没有考虑过的透视图中。以Java Runnable为例:如果Runnable是一个抽象类,那么任何实现线程的类都需要从它继承。这最终会导致非常不灵活的代码,因为您将无法从任何其他基类继承。但是,由于Runnable是一个接口,所以您可以让任何类实现它(不管它可能从哪个基类继承)。
我理解您对于必须检查类是否实现接口的关注--不幸的是,在弱类型语言中,您将不得不这样做,特别是因为PHP类型提示还没有完全进入其自身。
在强类型语言(如Java )中,您通常没有这样的顾虑,因为如果在不实现接口(或不实现特定方法)的类上调用接口方法,则会出现编译时错误。
发布于 2011-05-13 13:02:25
不是的。你不必使用实例。这是用于运行时类型检查的。如果要确保使用实现该接口的类,只需将接口类型放入方法签名中即可。例如
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
}那么你还可以做一些其他的好事,取决于你的语言。例如,使用java,您可以强制泛型类型实现给定的接口,从而允许泛型编程:
class generiClass<T extends yourInterface>{
public void genericMethod(T object){} //you can use a generic T class, but T needs to implement yourInterface
}产生接口的原因主要有2:
)完全一样。
发布于 2011-05-13 13:02:35
“我也知道接口基本上允许简单的多重继承行为和设计”
我想你误解了那部分。接口允许您确保特定类具有一组属性/方法。
示例:
function foo($obj) {
$obj->bar(); // fails with foo(array());
}与:
interface foobar {
function bar();
}
function foo(foobar $obj) { // $obj *must* have a bar() method
$obj->bar();
}https://stackoverflow.com/questions/5992144
复制相似问题