Oop 有可能;“动态绑定”;及;隐式;界面

Oop 有可能;“动态绑定”;及;隐式;界面,oop,programming-languages,Oop,Programming Languages,是否有任何构造允许实现一组函数的所有类被视为某个接口,即使这些类本身没有显式地实现该接口 为了让问题更清楚,我举个例子。假设我们想要实现LinearSearch,它查看整个数组并搜索某个键,在发现时返回键的索引。基本上,PSUDEO代码可能如下所示: LinearSearch(A, key) for (k = 0; k < A.length(); k++) if (A.get(k) == key) return k return NU

是否有任何构造允许实现一组函数的所有类被视为某个接口,即使这些类本身没有显式地实现该接口

为了让问题更清楚,我举个例子。假设我们想要实现
LinearSearch
,它查看整个数组并搜索某个键,在发现时返回键的索引。基本上,PSUDEO代码可能如下所示:

LinearSearch(A, key)
    for (k = 0; k < A.length(); k++)
        if (A.get(k) == key)
            return k
    return NULL
LinearSearch(A,键)
对于(k=0;k
在这种情况下,任何实现了
length
get
的类都可以在结构中进行搜索。我们可以在
DynamicArray
上实现这一点,它的作用与Java中的
ArrayList
相同。我们可以在
LinkedList
上实现这一点,忽略
get
在每个查询中花费线性时间的事实。类似地,对于实现这两个功能的其他结构也是如此。然而,这些类可能没有显式地实现公共接口,即使将它们放在一个接口中是有利的

在写这个问题的时候,我感到一种不安全感在我内心修补着这样一种结构,但我无法用语言表达出来。那么,您是否有任何理由认为这在实际语言中可能不是一个好的构造?

来源:

Go具有与支持给定方法集的任何类型兼容的“接口”类型(该类型不需要显式实现接口)。空接口,
interface{}
,与所有类型兼容

听起来这就是你的意思,所以这是另一种接口的感觉,而不是我们可能习惯于使用Java之类的语言。这是一种接口,其中涉及的方法的结构是重要的部分,而不是接口的名称

更正式地说,这似乎被称为a。

它被称为“duck-typing”。基于消息的对象模型(如Smalltalk)允许向对象发送任何消息,只要其名称和参数匹配

在C++语言中,可以使用“信号”和“时隙”来模拟这一点,在最原始的情况下,可以通过编写一个像

这样的模板适配器类来实现。
class CallGetLengthAdapterBase
{
public:
    int length() = 0;
    key_type key() = 0;
};

template<class N>
class CallGetLengthAdapter : public CallGetLengthAdapterBase
{
public:
    CallGetLengthAdapter( N* obj ) { mObject = obj; };

    int length() { return mObject->length(); };
    key_type key() { return mObject->key(); };
protected:
    N*          mObject;
};
就这些

LinearSearch( CallGetLengthAdapter<A_type>(&A), key );