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

OOP:实现具有更宽签名的接口方法,oop,inheritance,interface,covariance,design-by-contract,Oop,Inheritance,Interface,Covariance,Design By Contract,假设我有一个界面: INTERFACE `IFace` ( METHOD `f` (INT) : NIL ) 我想用一种具有更广泛特征的方法来实现它: CLASS `A` IMPLEMENTS `IFace` ( METHOD `f` (NUMBER n) : NIL ( PRINT n ) ) (假设该数字是INT的超类型) 为什么这是不可能的?或者哪些编程语言支持此功能?简短回答: 考虑以下示例: 第一个示例(来自您的示例): 第二个示例: public interf

假设我有一个界面:

INTERFACE `IFace` (
  METHOD `f` (INT) : NIL
)
我想用一种具有更广泛特征的方法来实现它:

CLASS `A` IMPLEMENTS `IFace` (
  METHOD `f` (NUMBER n) : NIL (
    PRINT n
  )
)
(假设该数字是INT的超类型)

为什么这是不可能的?或者哪些编程语言支持此功能?

简短回答: 考虑以下示例:

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

第二个示例

public interface Talking {

    public void speak(Human human);

}


public class Employee implements Talking {

    public void speak(Animal animal) {
        // can we speak with a cockroach?
    }
}
在层次结构中上移意味着超类型具有较少的子类型的函数和属性,因此不考虑接口风险: 如果可以抽象一个参数类型,那么就有可能让一个类实现一个接口,重新定义方法
method
f
(任意类型):NIL
方法
f
(OBJECT):NIL
,因为所有类型都从OBJECT继承

因此,可以定义一个类,该类将数字传递给
方法
f
(INT):NIL,但也可以定义另一个类,该类将字符串传递给它,从而有可能破坏接口签名和与客户机的契约(见下文)

长答覆: 实现接口的主要目的是将其公开给只知道该接口的客户机,而不知道实现该接口的类。 通过这种方式,您可以将实现相同接口的不同类传递给客户机,从而在不更改客户机的情况下更改软件的功能

与客户端签订的合同是在接口中指定的,而不是在类中指定的(该合同将为您的高级黑盒组件设计建模)

实际上,接口指定了类方法的签名(几乎以合法的方式),并且从设计中最重要的部分的角度来看。 类是需要公开它的接口的化身

因此,接口定义了一个类的行为,如果一个类可以更改该定义,那么它就可以打破与更改签名的客户端的“合法”合同

如果抽象参数,我们也会改变契约,因为更抽象的数据类型会有不同的行为和更具体的属性。 参见上面的示例,其中服务提供者(类)更改了签名,从而更改了合同。 合同签订后发生变更,没有人会高兴

这并不限制设计,因为在java中接口可以有多重继承。此外,从JDK5可以与接口一起使用

因此,我们可以使用泛型执行以下操作:

public interface IFace<T> {
    public void f(T n); 
}
公共接口IFace{
公共空间f(tn);
}
然后在子类中,我们对类型没有约束


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

您可能对我们感兴趣。您似乎认为这通常是不可能的。我想知道你为什么这么认为?@stakx我一直在用Java进行尝试,但它似乎不允许这样做。但也许埃菲尔或D或其他OO语言会这样做?谢谢!很好的解释和与蟑螂对话的例子确实令人信服:)
public interface IFace<T> {
    public void f(T n); 
}