一个类里静态方法的问题!高手指点一下! (30分)

  • 主题发起人 主题发起人 aipingren
  • 开始时间 开始时间
A

aipingren

Unregistered / Unconfirmed
GUEST, unregistred user!
type
tone=class
onepr:integer;
onepu:string;

procedure onepubl;
end;
type
Ttwo=class(tone)
twopr:integer;
twopu:string;

procedure onepubl;
end;

....
请问上面的例子执行结果是怎么样的啊?是不是类TTWO里的 procedure onepubl;会把类TONE里的 procedure onepubl;给覆盖掉?
 
是的,详细内容请参考Delphi技术手册,有关Delphi对象模型一章内容
 
看你怎么执行:TTwo 可以转化为 TOne

type
tone=class
onepr:integer;
onepu:string;

procedure onepubl;
end;
type
Ttwo=class(tone)
twopr:integer;
twopu:string;

procedure onepubl;
end;


{ tone }

procedure tone.onepubl;
begin
showmessage('this is ONE');
end;

{ Ttwo }

procedure Ttwo.onepubl;
begin
showmessage('this is Two');
end;

procedure TForm1.Button9Click(Sender: TObject);
var
one:TOne;
two:TTwo;
begin
one.onepubl
//one
two.onepubl
//two
TOne(two).onepubl
// one
end;
 
为什么利用把子类赋值给他的父类变量啊?TOne(two).onepubl
// one

为什么?
 

type
tone=class
onepr:integer;
onepu:string;

class procedure onepubl;
end;
type
Ttwo=class(tone)
twopr:integer;
twopu:string;

class procedure onepubl;
end;
在前面加个class,这才是静态方法
 
在Delphi和C++中有一点不同, C++的静态方法用class 前缀声明,但是在Delphi中
不是虚方法(virtual) 和 动态方法(dynamic) 的都是静态方法, 静态方法和虚方
法(或者动态方法)的区别就是是编译时绑定还是运行时绑定. 通常Delphi避免称呼
静态方法, 而以方法来称呼他们. 用class声明的是类方法. 可以不用创建实例直接
引用, 如TOne.onepubl.
 
其实class mathod 不过是borland的一个简明方法.如果不用class procedre,
你也可以用下面的写法:
TOne(nil).onepubl;
TTwo(nil).onepubl;

或是var I:Integer;
TOne(I).onepubl;

呵呵!Delphi的一般方法是编译期分配空间的.
 
会的啊!
具体调用的是哪一个,要看声明的是哪一个类的对象!
 
a)会覆盖
b)即使没有用到vitual或dynamic和override,子类仍能重用父类代码,用inherited,
虚方法设计是为多态服务的
即 procedure TTwo.onepubl
begin
inherited;
.....
end;
在父类中加个MessageBox一试便知
 
不会覆盖, 而是隐藏。
比如jxsjd的例子中
two.onepubl

TOne(two).onepubl ;
两者调用的方法是不同的。 也就是说,你在类外面可以分别调用到TOne.onepubl和TTwo.nepubl.

而如果是类似下面这种定义:
tone=class
onepr:integer;
onepu:string;

procedure onepubl;virtual;
end;
type
Ttwo=class(tone)
twopr:integer;
twopu:string;

procedure onepubl
override;
end;

那么jxsjd例子中
two.onepubl

TOne(two).onepubl ;
调用的都是TTwo.onepubl, 也就是说对TTwo.Create生成的对象实例你已经没有办法在类外面调用到TOne.onepubl了。
这才是真正的覆盖。
 
同一楼上的说法
 
后退
顶部