思归呓语

衣带渐宽终不悔,为伊消得人憔悴
随笔 - 409, 评论 - 2969, 引用 - 245

导航

关于

标签

每月存档

最新留言

广告

 

Ruby和其他动态语言里有个东西叫Duck Typing,按Dave Thomas的话来说,if an object walks like a duck and talks like a duck, then it must be a duck (如果一个对象走起路来象鸭子,叫起来也象鸭子,那么它一定是只鸭子!)

譬如,Ruby里可以这么做

class Duck
 def Quack
   puts "I am a duck, so I quack"
 end
end

class Pig
 def Quack
   puts "I am a pig, I don't quack, but I am faking..."
 end
end

animals = [Duck.new, Pig.new]
animals.each {|animal| animal.Quack}

即使是只猪,只要它能Quack,在这里它就是只鸭。在Ruby里,the type of an object is defined by what that object can do。

VB里也有这样的动态机制,譬如,通过后期绑定,你可以这么做

Option Explicit On
Option Strict Off 'this is important

Imports System

Class Duck
 Sub Quack()
   Console.WriteLine("I am a duck, so I quack")
 End Sub
End Class

Class Pig
 Sub Quack()
   Console.WriteLine("I am a pig, I don't quack, but I am faking...")
 End Sub
End class

Class TestDuck
  Shared Sub Main
 dim animals() = {New Duck, New Pig}
 for each animal in animals
  animal.Quack()
 next
  End Sub
End Class

还能以动态接口的方式做,

Dynamic Interface IQuack
  Sub Quack
End Interface

dim animals() = {New Duck, New Pig}
for each animal in animals
 dim a as IQuack = animal
 a.Quack()
next

还引进了动态Dynamic Identifiers的概念,文档声称你可以这么做

dim t = Type.GetType("Duck")
dim o  = New(t)(new object(){})
o.("Quack")() 

可惜编译时出错,

C:\Program Files\VB LINQ Preview\Bin\TestDuck.vb(41) : error BC30182: Type expected.
dim o  = New(t)(new object(){}) 
              
但这么做是可以的,

dim t = Type.GetType("Duck")
dim o = Activator.CreateInstance(t, new object(){})
o.("Quack")()   '通过字符串来调用方法


文档最后说,
".......This makes Visual Basic 9.0 an excellent choice for modern Agile and test-driven development methodologies."

这样下去,VB也许会成为大家最喜欢的语言的,

打印 | 张贴于 2006-01-25 14:31:00 | Tag:.NET

留言反馈

#回复: VB的日益动态化 编辑
回楼上,这就是抽象的力量!如果它满足我们对鸭子特性的需求——不管它是不是真的鸭子——我们都可以把适用于鸭子的动作作用于它
2008-02-17 06:52:00 | [匿名用户:Evden eve nakliyat]
#evden eve nakliyat 编辑
果然是vb的偏执狂~~
呵呵
2008-02-17 06:51:00 | [匿名用户:thanks]
#evden eve nakliyat 编辑
THANKSSS
2008-02-17 06:50:00 | [匿名用户:thanks]
#回复: VB的日益动态化 编辑
seo yar??mas?
2007-11-18 02:41:00 | [匿名用户:seo yarışması]
#回复: VB的日益动态化 编辑
2007-09-01 05:15:00 | [匿名用户:kiraloyun]
#re: VB的日益动态化 编辑
高人。。。。。。。。。。。。。。。。。。。。。
2006-09-11 09:35:00 | [匿名用户:可乐虫]
#re: VB的日益动态化 编辑
@Ninputer
果然是vb的偏执狂~~
呵呵
2006-02-10 13:26:00 | [匿名用户:xiao_ppp]
#re: VB的日益动态化 编辑
回楼上,这就是抽象的力量!如果它满足我们对鸭子特性的需求——不管它是不是真的鸭子——我们都可以把适用于鸭子的动作作用于它
2006-01-26 18:54:00 | [匿名用户:Ninputer]
#re: VB的日益动态化 编辑
if an object walks like a duck and talks like a duck, then it must be a duck (如果一个对象走起路来象鸭子,叫起来也象鸭子,那么它一定是只鸭子!)

--- 实际是一个机器玩具鸭子,它是真鸭子吗?
2006-01-26 17:55:00 | [匿名用户:hfhfhjfgh]
#re: VB的日益动态化 编辑
尽管匿名方法是个不错而且吸引人的特性,但是C#实现它的语法我一点也不喜欢。所以我才要开发VBF弥补这两种语言在FP思想上的不足
2006-01-26 13:12:00 | [匿名用户:Ninputer]
#re: VB的日益动态化 编辑
这个最新的ctp支持了吗?在ide中出错,没有试直接用编译器
其实2005就应该支持的,匿名delegate实在是太有用了,有此一个我已经非常满足了
2006-01-26 12:20:00 | [匿名用户:jjx]
#re: VB的日益动态化 编辑
Vb 越来越让人看不懂了,真的成为技术玩具了。

好处是功能更强大了,缺点是开发成本提高了,变得4不像。
2006-01-26 10:43:00 | [匿名用户:Duiker]
#re: VB的日益动态化 编辑
@jjx

老实说,VB支持它们(Nested Function & Lambda Function)。
2006-01-26 09:18:00 | [匿名用户:Ninputer]
#re: VB的日益动态化 编辑
老实说,连匿名方法或是闭包之类的都不支持,要说动态真的是很难。vb团队要加油了
2006-01-25 22:58:00 | [匿名用户:jjx]
#re: VB的日益动态化 编辑
我不喜欢BASIC,只因为它的语法让我很不爽,在C中一句话可以解决的事,在BASIC中要好几句....
有的时候为了多出来的这几句,还要多定义几个变量....shit
2006-01-25 21:57:00 | [匿名用户:feilfly]
#re: VB的日益动态化 编辑
我以前喜欢VB语法,自从学了c#后就再也没有用VB了,因为C#看起来简洁,思维开扩多了
2006-01-25 16:05:00 | [匿名用户:地]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.8