`
tomrose
  • 浏览: 147485 次
  • 来自: ...
社区版块
存档分类
最新评论

静态分派,动态分派,多分派,单分派 -------------- visitor模式准备

阅读更多
一,静态分派:
1,定义:发生在编译时期,分派根据静态类型信息发生,重载就是静态分派
2,什么是静态类型:变量被声明时的类型是静态类型
??????什么是动态类型:变量所引用的对象的真实类型
3,有两个类,BlackCat ,WhiteCat都继承自Cat
如下调用
class?Cat{}
class?WhiteCat?extends?Cat{}
class?BlackCat?extends?Cat{}
public?class?Person?{
????
public?void?feed(Cat?cat){
????????System.out.println(
"feed?cat");
????}

????
public?void?feed(WhiteCat?cat){
????????System.out.println(
"feed?WhiteCat");
????}

????
public?void?feed(BlackCat?cat){
????????System.out.println(
"feed?BlackCat");
????}

????
public?static?void?main(String[]?args)?{
????????Cat?wc?
=?new?WhiteCat();
????????Cat?bc?
=?new?BlackCat();
????????Person?p?
=?new?Person();
????????p.feed(wc);
????????p.feed(bc);
????}


}

运行结果是:
feed cat
feed cat
这样的结果是因为重载是静态分派,在编译器执行的,取决于变量的声明类型,因为wc ,bc都是Cat所以调用的都是feed(Cat cat)的函数.
二,动态分派
1,定义:发生在运行期,动态分派,动态的置换掉某个方法。
还是上边类似的例子:
class?Cat{
????
public?void?eat(){
????????System.out.println(
"cat?eat");
????}

}

public?class?BlackCat?extends?Cat{
????
public?void?eat(){
????????System.out.println(
"black?cat?eat");
????}

????
public?static?void?main(String[]?args){
????????Cat?cat?
=?new?BlackCat();
????????cat.eat();
????}

}
这个时候的结果是:
black cat eat
这样的结果是因为在执行期发生了向下转型,就是动态分派了。

三,单分派:
1,定义:根据一个宗量的类型进行方法的选择
四,多分派:
1,定义:根据多于一个宗量的类型对方法的选择
2,说明:多分派其实是一系列的单分派组成的,区别的地方就是这些但分派不能分割。
3,C++ ,Java都是动态单分派,静态多分派语言
多分派的语言有:CLOS? Cecil

最后的部分:

看完本文,如果你对visitor模式有更多的兴趣,想了解更多请看如下几篇文章。
1,静态分派,动态分派,多分派,单分派 --------------?? visitor模式准备(本文)
2,访问差异类型的集合类 ------------------------?? visitor模式入门
3,visitor模式理论及学术概念-------------------?? visitor模式进一步
4,重载overloading和覆写overriding哪个更早执行--?? visitor帮助篇
虽然排列顺序是1,2,3,4但是我个人建议的学习方式是2,1,3,4因为这个顺序更方便一般人理解



dreamstone 2006-12-20 01:08 发表评论
分享到:
评论

相关推荐

    C#23种设计模式【完整】_(0610).rar

    23. **访问者模式(Visitor)**:表示一个作用于某对象结构中的各元素的操作。C#中,可以使用双分派(double dispatch)来实现访问者。 以上23种设计模式在C#编程中具有广泛的实践价值,熟练掌握这些模式将极大地...

    23种设计模式(C++版)

    在C++中,可以使用双分派(double dispatch)技巧来实现Visitor模式。 9. **Chain of Responsibility模式**:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并...

    GoF-Design-Patterns:我的GoF设计模式示例代码。 (用C ++ 1114编写)

    - 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。C++标准库中的std::observer和std::subject接口可以实现观察者模式。 - 状态模式...

    C#23种设计模式【完整】

    22. **访问者模式(Visitor)**:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。C#中可以利用双分派实现访问者模式。 23. **组合模式(Composite)...

    二十三种设计模式【PDF版】

    设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. 设计模式引言 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相关的对象,以适当的粒度将...

    23种设计模式的C++实现

    23. **访问者模式(Visitor)**:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变元素类的前提下定义作用于这些元素的新操作。C++中通常通过双分派来实现。 这些设计模式在C++编程中有着广泛的应用...

    design-patterns:C ++中的设计模式模板

    观察者模式定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。C++中,可以使用STL中的`std::function`和`std::vector`来实现订阅和发布机制。 七、装饰器模式...

    Design_Patterns:在此仓库中,我将介绍我处理过的每种设计模式

    6. **装饰器模式**(Decorator):动态地给一个对象添加一些额外的职责,提供了一种用多个独立的对象替换继承关系来扩展功能的方法。C++中,可以通过继承和组合的结合来实现装饰器。 7. **适配器模式**(Adapter)...

    超级有影响力霸气的Java面试题大全文档

    25、JSP中动态INCLUDE与静态INCLUDE的区别?  动态INCLUDE用jsp:include动作实现 它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的变化...

Global site tag (gtag.js) - Google Analytics