如果说一个类的重载构造函数可以被认为是鸭子类型的“鸭子”,这是一个公平的假设吗?假设ClassA有一个重载的构造函数,那么不同的构造函数存在是有原因的--对象的使用方式表明它的所有属性都不需要设置才能正确执行。
所以,我问,重载的构造函数是鸭子吗?
发布于 2014-07-22 20:57:09
我认为这不是静态语言中一种可以接受的鸭子输入形式。
在一种支持鸭子类型的语言中,人们希望能够定义一个函数,该函数接受未指定类型的对象foo,该对象定义函数(或属性) bar。
def call_bar (foo) {
foo.bar
}函数不关心foo是什么类型,只是定义了bar。您的系统不提供任何方法让函数接受任何类型的对象,只要该类型定义了所需的函数。
在大多数语言中,典型的方法是定义接口。这并不能让我们一路走到那里,但它让我们更接近了。我们至少可以定义一个契约,通过它我们可以识别类型上的任何相关函数/属性/等等。
然后可以编写一个函数,这样它就可以通过接口而不是具体的类接受输入。我们保留在编译时检查类型的能力,以确保输入中存在所需的函数,同时获得忽略实现细节的灵活性。
Scala有一种有趣的方法,它提供了一种在静态语言中获取鸭子类型行为的更灵活的方法。Scala允许您使用以下语法引用其成员的类型:
def callBar(foo : { def bar() : Unit }) = {
foo.bar()
}这将匹配定义bar函数的任何类型,不接受输入并返回空输出。您还保留了静态语言的静态类型转换优点,而不是依赖后期绑定来确定输入是否具有正确的成员。
发布于 2014-07-22 20:49:03
不不是。
特定类的对象都支持完全相同的消息集,不管是用什么构造函数创建的。重载构造函数仅仅意味着没有必要显式地初始化构成对象状态的所有字段。例如,一个对象的颜色可能有一个合理的默认值,所以您可以有一个带有颜色值的构造函数和一个没有这样的值的构造函数,而作为另一个实体的强制外键的字段不能由类组成,所以它总是必须是一个构造函数参数。但是在Java中,在构造对象时,所有类成员都是完全定义的(实际上,在运行时没有未定义的值),所以将Java对象与鸭类型语言中的对象进行比较是没有帮助的。
发布于 2014-07-22 20:47:32
可以公平地说,重载的构造函数指定了构建鸭子的不同方式。不过,那不是鸭子打字。
请考虑以下课程:
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.
}
}https://softwareengineering.stackexchange.com/questions/250777
复制相似问题