擅长:python、mysql、java
<p>我不认为双重分派或多重方法有什么特别的相关性,也与人们对另一方的反对意见没有多大关系。在</p>
<p>毫不奇怪,为了使您所做的事情更加面向对象,您需要在其中引入一些对象(和相应的类)。使每个值成为一个类的实例将允许——事实上,实际上是强制——您停止检查其类型。下面对示例代码的修改显示了一种非常简单的方法:</p>
<pre><code>class Value(object):
""" Generic container of values. """
def __init__(self, type_, val):
self.type = type_ # using 'type_' to avoid hiding built-in
self.val = val
def myfunc(val):
# Look ma, no type-checking!
cmdline = 'magicprogram {obj.type} {obj.val}'.format(obj=val)
print 'Popen({!r}, ... blah blah)'.format(cmdline)
# ...
val1 = Value('i', 42)
val2 = Value('s', 'foobar')
myfunc(val1) # Popen('magicprogram i 42', ... blah blah)
myfunc(val2) # Popen('magicprogram s foobar', ... blah blah)
</code></pre>
<p>如果在<code>Value</code>类中有方法间接地访问其属性,那么它将更加面向对象,但仅执行上述操作就可以消除臭名昭著的类型检查。更面向对象的设计可能会为每种类型的<code>Value</code>有一个不同的子类,这些子类都为客户机(如<code>myfunc()</code>)共享一组公共方法,用于创建、操作和从中提取信息。在</p>
<p>使用对象的另一个好处是,如果/当您向应用程序添加对新类型“Value”的支持时,您不必修改<code>myfunc()</code>如果您对“Value”本质的抽象是好的,也就是说。在</p>