首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >面向接口点

面向接口点
EN

Stack Overflow用户
提问于 2011-05-13 12:55:28
回答 3查看 966关注 0票数 11

可能重复:

Interface vs Abstract Class (general OO)

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

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

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

我不明白的是,每次调用instanceOf方法时,我们是否都必须检查类是否实现了与它的接口?如果不阅读文档,您就不知道某些类实现了接口。如果您阅读了代码,那么您可以看到自己已经定义了该方法,您可以调用它吗?!

如果我有

案件A。

代码语言:javascript
运行
复制
class Ball{
function kick(){...};
}

或案件B。

代码语言:javascript
运行
复制
interface Kickable{
function kick;
}

class Ball implements Kickable{
function kick(){...};
}

唯一的区别是,在A种情况下,当调用一个不存在的方法(“在运行时”)时,我会得到一个错误,而在B种情况下,我将在尝试“编译”的同时运行代码时得到这个错误。运行时和编译在这里肯定使用错误(PHP环境)。

我记得在Java中有一个可运行的接口,它支持线程处理。为什么我们必须实现一个接口Runnable,然后在该类中定义run()方法?我的意思是,类可以有一个Run方法,而不需要实现一个接口,还有一些方法可以检查类是否定义了一个特殊的方法。好吧,也许我的Java部分有点让人困惑:))

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

谢谢你,卢卡

EN

回答 3

Stack Overflow用户

发布于 2011-05-13 13:08:49

您已经在您的问题中指定了接口的大部分优点,即:

  • 允许多个(接口)继承

您还提到,您知道抽象类和接口之间的区别。因此,使用接口的另一个好处是:

  • 任何类都可以实现接口,而没有任何类可以从抽象类

派生。

这基本上是上面第一点的重新哈希,但是它把它放在了一个您以前可能没有考虑过的透视图中。以Java Runnable为例:如果Runnable是一个抽象类,那么任何实现线程的类都需要从它继承。这最终会导致非常不灵活的代码,因为您将无法从任何其他基类继承。但是,由于Runnable是一个接口,所以您可以让任何类实现它(不管它可能从哪个基类继承)。

我理解您对于必须检查类是否实现接口的关注--不幸的是,在弱类型语言中,您将不得不这样做,特别是因为PHP类型提示还没有完全进入其自身。

在强类型语言(如Java )中,您通常没有这样的顾虑,因为如果在不实现接口(或不实现特定方法)的类上调用接口方法,则会出现编译时错误。

票数 4
EN

Stack Overflow用户

发布于 2011-05-13 13:02:25

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

代码语言:javascript
运行
复制
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,您可以强制泛型类型实现给定的接口,从而允许泛型编程:

代码语言:javascript
运行
复制
class generiClass<T extends yourInterface>{
      public void genericMethod(T object){} //you can use a generic T class, but T needs to implement yourInterface
}

产生接口的原因主要有2:

  1. 强制类实现某些方法--
  2. 允许在没有多重继承的语言中使用类似于特性的多重继承(在像C++这样的语言中,有多个继承,则不需要接口。或者更好地说,接口与纯抽象类(

)完全一样。

票数 2
EN

Stack Overflow用户

发布于 2011-05-13 13:02:35

“我也知道接口基本上允许简单的多重继承行为和设计”

我想你误解了那部分。接口允许您确保特定类具有一组属性/方法。

示例:

代码语言:javascript
运行
复制
function foo($obj) {
  $obj->bar(); // fails with foo(array());
}

与:

代码语言:javascript
运行
复制
interface foobar {
  function bar();
}

function foo(foobar $obj) { // $obj *must* have a bar() method
  $obj->bar();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5992144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档