我应该如何调用使用 duck typing 的过程?我该怎么说“我正在进行鸭子打字”或“我正在检查它是不是鸭子:)”。
鸭子检查听起来不太好,类型检查只是它的名字错误。
答案 0 :(得分:2)
我正在使用鸭子打字。它与“我正在使用静态类型”的行相同,尽管它们是不同的东西。
答案 1 :(得分:0)
我认为上下文在这里很重要,我们是在谈论内联评论还是整体设计文档?
对于设计文档,我认为说我正在使用鸭子打字是合理的。
在代码中的某一点,我不确定这样说是否有用。考虑一下,使用一些虚构的语言
function wibble(anObject) {
// what do we say here?
anObject.computeMedianValue();
anObject.render(device);
}
首先请注意,我们实际上并没有检查它是鸭子,在示例中我看到代码只是
obj.quack()
程序结构通常只安排那些可以嘎嘎叫的东西传下去。
我没有看到很多例子if (obj can quack )
obj.quack()
else if ( obj can grunt)
obj.grunt()
这不会是非常多态的,但即使我们确实想检查功能,我们也不会编写代码
if ( obj isA duck)
鸭子打字的整个想法是我们考虑当前环境中我们需要的特定功能 - 走路(像鸭子),嘎嘎(像鸭子) - 不是“它是鸭子吗?”
所以在代码中我不会特别引用duck typing,除了我在标准Java程序周围进行我正在进行面向对象。评论可能会说明为什么你知道该对象可以计算中位数,或者如果不能计算该怎么做。
答案 2 :(得分:0)
鸭子打字
该名称来自短语:
如果看起来像鸭子,像鸭子一样游泳,像鸭子一样呱呱叫, 然后它可能是一只鸭子。
https://en.wikipedia.org/wiki/Duck_test
这意味着如果它具有鸭子的所有相关属性,那么为什么还要仔细进行仔细测试以检查它是否是鸭子以外的其他东西。
它可能不是一只鸭子,但大多数人都不在乎,因为它现在就像那些重要的鸭子一样。
鸭子打字方式类似:为什么要控制参数和变量的类型以限制用户可以执行的操作。
只要操作仍然适用于任何类型的操作,传递给函数的类型都无关紧要。
如果你可以添加两种类型,谁在乎它们的数字类型?
如果传递给paginateResult()
函数的对象具有query()
和get_next_result()
方法,那么它的类型是什么?
在静态类型语言中,对象必须是queryResult
的子类或实现paginates
接口。