面向对象之路--静态方法-虚方法和动态方法
2007-03-14 22:22
465 查看
按照方法的绑定机制分:static,virtual,dynamic;后两种又叫abstract method.
在面向过程编程中,语言是早绑定的;
面向对象编程中,既可早绑定也可晚绑定,给程序员很大的灵活性.
tMyclass=class
procedure iAmStatic;//静态
procedure iAmVirtual;//虚方法
procedure iAmDynamic;//动态方法
procedure iAmVirtualAbstract;Virtual;Abstract;//虚抽象方法
end;
=========
type
tcomputer=class
procedure starting;
end;
tnotebookPc=class(tcomputer)
procedure starting;
end;
var
computer=Tcomputer;
notebookPc=tmotebookpc ;
begin
computer:=tcomputer.create;
computer.starting; //调用的是tcomputer.starting
computer.destroy;
computer:=tnotebookpc.create;//引用的该类的对象,但他声明的是tcomputer;
computer.starting;// 调用的是tcomputer.starting;
tnotebookpc(computer).starting;//调用的是tnotebookpc
computer.Destroy;
notebookpc:=tnotebookpc.create;
notebookpc.starting; //调用的是tnotebookpc
notebookpc.destroy;
end;
静态方法就象通常的过程和函数那样调用.当调用一个静态方法时.类或对象所声明的类型决定了哪种方法被执行.编译器知道这些方法的地址.执行速度最快,但不能被覆盖,不支持多态性.
虚方法和动态方法能在派生类中被覆盖,调用时由类或对象的实际类型决定哪种实现被调用,而不是他们声明的类型.一切都发生在运行时
虚方法------>由VMT(包含祖先类的虚方法和本对象的虚方法)调度;内存使用比动态方法多,但执行速度较快;
动态方法(编译器指定一个唯一的编号no.)-----no.--->DMT(包含该对象的动态方法和祖先类的DMT),通过祖先DMT访问祖先其余的动态方法.使用内存比虚方法少,但执行速度慢.
type
tcomputer=class
procedure starting;virtual;
end;
tnotebookPc=class(tcomputer)
procedure starting;override;
end;
tPC=class(tcomputer);
procedure starting;override;
end;
....
...
var
computer:tcomputer;
begin
computer:=tnotebookpc.create;
computer.starting; //diaoyong tnotebookpc.starting;
computer.destroy;
computer:=tPC.create;
computer.starting; //diaoy调用的是tpc.starting;
computer.destroy;
end;
在面向过程编程中,语言是早绑定的;
面向对象编程中,既可早绑定也可晚绑定,给程序员很大的灵活性.
tMyclass=class
procedure iAmStatic;//静态
procedure iAmVirtual;//虚方法
procedure iAmDynamic;//动态方法
procedure iAmVirtualAbstract;Virtual;Abstract;//虚抽象方法
end;
=========
type
tcomputer=class
procedure starting;
end;
tnotebookPc=class(tcomputer)
procedure starting;
end;
var
computer=Tcomputer;
notebookPc=tmotebookpc ;
begin
computer:=tcomputer.create;
computer.starting; //调用的是tcomputer.starting
computer.destroy;
computer:=tnotebookpc.create;//引用的该类的对象,但他声明的是tcomputer;
computer.starting;// 调用的是tcomputer.starting;
tnotebookpc(computer).starting;//调用的是tnotebookpc
computer.Destroy;
notebookpc:=tnotebookpc.create;
notebookpc.starting; //调用的是tnotebookpc
notebookpc.destroy;
end;
静态方法就象通常的过程和函数那样调用.当调用一个静态方法时.类或对象所声明的类型决定了哪种方法被执行.编译器知道这些方法的地址.执行速度最快,但不能被覆盖,不支持多态性.
虚方法和动态方法能在派生类中被覆盖,调用时由类或对象的实际类型决定哪种实现被调用,而不是他们声明的类型.一切都发生在运行时
虚方法------>由VMT(包含祖先类的虚方法和本对象的虚方法)调度;内存使用比动态方法多,但执行速度较快;
动态方法(编译器指定一个唯一的编号no.)-----no.--->DMT(包含该对象的动态方法和祖先类的DMT),通过祖先DMT访问祖先其余的动态方法.使用内存比虚方法少,但执行速度慢.
type
tcomputer=class
procedure starting;virtual;
end;
tnotebookPc=class(tcomputer)
procedure starting;override;
end;
tPC=class(tcomputer);
procedure starting;override;
end;
....
...
var
computer:tcomputer;
begin
computer:=tnotebookpc.create;
computer.starting; //diaoyong tnotebookpc.starting;
computer.destroy;
computer:=tPC.create;
computer.starting; //diaoy调用的是tpc.starting;
computer.destroy;
end;
相关文章推荐
- Spring开发之静态工厂创建对象+动态工厂创建对象+构造方法创建对象+set方法注入+构造方法注入
- php面向对象中static静态属性和静态方法的调用
- php面向对象中static静态属性和静态方法的调用
- php面向对象中static静态属性和静态方法的调用
- php部分---面向对象静态、抽象类、oop接口、加载类、魔术方法、关键字。
- 动态的内部类不能在静态方法中直接声明对象
- 关于java中子类,父类中,静态代码块: staic{},动态代码块:{},构造方法,类属性,对象属性等执行顺序做个总结:
- 面向对象银角大王补充2-self就是调用当前方法的对象-静态字段,公有属性-封装的理解-继承的理解,普通方法,静态方法
- java学习之路 之 高级类特性1-面向对象特征之二:继承及方法重写(override)
- php面向对象中static静态属性和静态方法的调用
- php面向对象中static静态属性和静态方法的调用
- 黑马程序员--03.Java面向对象--02.【static关键字】【main方法】【静态成员】
- php 面向对象之继承、多态和静态方法
- php面向对象中static静态属性和静态方法的调用
- php面向对象笔记4 多态,静态方法,单例模式
- Delphi对象的方法能定义- 静态(static)、虚拟(virtual)、动态(dynamic)或消息处理(message)
- php面向对象中的单例与静态方法的对比,以及关于class自动加载的分析
- php面向对象中static静态属性和静态方法的调用
- Java面向对象-static静态方法与普通方法
- php部分---面向对象静态、抽象类、oop接口、加载类、魔术方法、关键字。