OOP:实现具有更广泛签名的接口方法



假设我有一个接口:

INTERFACE `IFace` (
  METHOD `f` (INT) : NIL
)

,我想用具有更广泛签名的方法来实现它:

CLASS `A` IMPLEMENTS `IFace` (
  METHOD `f` (NUMBER n) : NIL (
    PRINT n
  )
)

(假设该数字是INT的超级类型)

为什么不可能?或哪些编程语言支持此?

简短答案:

考虑以下示例:

第一个示例(来自您的示例):

INTERFACE `IFace` (
  METHOD `printFibonacci` (INT) : NIL
)
CLASS `A` IMPLEMENTS `IFace` (
  METHOD `printFibonacci` (NUMBER n) : NIL (
    //what if the number is a not an integer? Can we guarantee to the client that we are respecting the method signature?
  )
)

第二个示例

public interface Talking {
    public void speak(Human human);
}

public class Employee implements Talking {
    public void speak(Animal animal) {
        // can we speak with a cockroach?
    }
}

在层次结构中上升意味着超类型的功能和属性较小,因此接口风险不受尊重:如果可以抽象一个param类型,则可以将实现界面的类实现,将方法METHOD F (ANY_TYPE) : NIL重新定义为METHOD F (OBJECT) : NIL,因为所有类型都从对象继承。

因此,可以定义一个将数字传递给METHOD F (INT) : NIL的类,但也可以定义另一个将字符串传递给其的类,有可能打破接口签名和与客户的合同(请参阅下文)。

长答案:

实现接口的主要目的是将其暴露于仅知道接口的客户端,而不是实现它的类。这样,您可以将实现相同界面的客户端转移到客户不同的类别,更改软件的功能而无需更改客户端。

合同与客户端指定的界面不在类中指定(该合同将建模您的高级,黑匣子组件设计)。

的确,接口指定了类方法的签名(几乎是一种法律方式),以及从合同的角度设计的,这是设计中最重要的部分。类是化身,需要公开它。

因此,接口正在定义类的抽象数据类型行为,如果类可以更改该定义,则可以与客户更改签名的"法律"合同。

,如果抽象参数,我们也正在更改合同,因为更多的抽象数据类型将具有不同的具体行为和属性。请参阅上面的示例,其中服务提供商(类)更改签名和合同。签署合同后,没有人很高兴。

这不是限制设计的,因为接口可以在Java中具有多个继承。此外,从JDK5中,您可以将仿制药与接口使用。

因此,我们可以使用仿制药来执行以下操作:

public interface IFace<T> {
    public void f(T n); 
}

,然后在子类中,我们对类型没有约束。

请注意,在这种情况下,合同没有指定有关参数类型的任何内容,因此客户不应该期望任何东西,也不能起诉我们。

相关内容

  • 没有找到相关文章

最新更新