首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态类型语言中的鸭子类型

静态类型语言中的鸭子类型
EN

Software Engineering用户
提问于 2014-07-22 20:38:07
回答 3查看 615关注 0票数 2

如果说一个类的重载构造函数可以被认为是鸭子类型的“鸭子”,这是一个公平的假设吗?假设ClassA有一个重载的构造函数,那么不同的构造函数存在是有原因的--对象的使用方式表明它的所有属性都不需要设置才能正确执行。

所以,我问,重载的构造函数是鸭子吗?

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2014-07-22 20:57:09

不,不是鸭子输入

我认为这不是静态语言中一种可以接受的鸭子输入形式。

在一种支持鸭子类型的语言中,人们希望能够定义一个函数,该函数接受未指定类型的对象foo,该对象定义函数(或属性) bar

代码语言:javascript
运行
复制
def call_bar (foo) {
  foo.bar
}

函数不关心foo是什么类型,只是定义了bar。您的系统不提供任何方法让函数接受任何类型的对象,只要该类型定义了所需的函数。

,那么我们如何才能在静态类型的语言中进行鸭子输入呢?

1.接口

在大多数语言中,典型的方法是定义接口。这并不能让我们一路走到那里,但它让我们更接近了。我们至少可以定义一个契约,通过它我们可以识别类型上的任何相关函数/属性/等等。

然后可以编写一个函数,这样它就可以通过接口而不是具体的类接受输入。我们保留在编译时检查类型的能力,以确保输入中存在所需的函数,同时获得忽略实现细节的灵活性。

2.结构类型

Scala有一种有趣的方法,它提供了一种在静态语言中获取鸭子类型行为的更灵活的方法。Scala允许您使用以下语法引用其成员的类型:

代码语言:javascript
运行
复制
def callBar(foo : { def bar() : Unit }) = {
  foo.bar()
}

这将匹配定义bar函数的任何类型,不接受输入并返回空输出。您还保留了静态语言的静态类型转换优点,而不是依赖后期绑定来确定输入是否具有正确的成员。

票数 11
EN

Software Engineering用户

发布于 2014-07-22 20:49:03

不不是。

特定类的对象都支持完全相同的消息集,不管是用什么构造函数创建的。重载构造函数仅仅意味着没有必要显式地初始化构成对象状态的所有字段。例如,一个对象的颜色可能有一个合理的默认值,所以您可以有一个带有颜色值的构造函数和一个没有这样的值的构造函数,而作为另一个实体的强制外键的字段不能由类组成,所以它总是必须是一个构造函数参数。但是在Java中,在构造对象时,所有类成员都是完全定义的(实际上,在运行时没有未定义的值),所以将Java对象与鸭类型语言中的对象进行比较是没有帮助的。

票数 2
EN

Software Engineering用户

发布于 2014-07-22 20:47:32

可以公平地说,重载的构造函数指定了构建鸭子的不同方式。不过,那不是鸭子打字。

请考虑以下课程:

代码语言:javascript
运行
复制
public class Rectangle
{
    public Rectangle(Point A, Point B)
    {
        // Constructs a rectangle by using points A and B as a diagonal,
        // and filling in the rectangle with the usual lines at right angles.
    }

    public Rectangle(Point A, Length diagonal, Angle angle)
    {
        // Computes Point B using the specified size and diagonal, and then
        // calls the first constructor.
    }

    public Rectangle(Point A, Point B, Point C, Point D)
    {
        // Constructs a rectangle from the four supplied points, and 
        // verifies that all angles are 90 degrees.
    }
}
票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/250777

复制
相关文章

相似问题

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