关于作用域的两个问题(100分)

  • 主题发起人 主题发起人 Bright
  • 开始时间 开始时间
B

Bright

Unregistered / Unconfirmed
GUEST, unregistred user!
1:
程序如下:
TSomeClass = class;

TSomeClass = class(TObject)
public
Value: Integer;
function SomeFunc(AClass: TSomeClass);
end;



function TSomeClass.SomeFunc(AClass: TSomeClass)
var
Value: Integer;
begin
with AClass do begin
// 如何在此处访问函数的局部变量Value?
end;
end;

2:
程序如下:
TClassOne = class(TObject)
private
FItem: Pointer;
public
property Item: Pointer read FItem write FItem;
end;

TClassTwo = class(TClassOne)
private
function GetItem: TObject;
public
property Item: TObject read GetItem;
end;

如何在TClassTwo中访问TClassOne的Item(Pointer)属性?


 
第一个问题:在下的意思是没治!
第二个问题:可由Delphi的滞后联编机制解决,Delphi还是很聪明的,会自己
作出判断,唯一遗憾的是在写代码的时候Delphi的自动提示有点傻气。

var
....
VarOfPointer:Pointer;
VarOfTObject:TObject;
VarOfTClassTwo:TClassTwo;
.....
VarPointer:=VarOfTClassTwo.Item;//TClassTwo定义的Item;
VarOfTObject:=VarOfTClassTwo.Item;//TClassOne定义的Item;

 
第二个问题
如果是在属性读取函数中,如此访问就回产生死循环;在其它地方也不能保证正确。不过,我自己已经解决了。应该使用强制类型转换

TClassOne(ClassTwo).Item

现在100分全部集中在第一问上。
 
第一个问题好象没没办法,唯一的方法是把VALUE改名
第二个问题好象不是很复杂.搞定了?不说了.
 
问题一无解, 这就是答案
 
为什么要把函数的局部定义成Value, 换个名不成吗?
 
为什么要把函数的局部定义成Value, 换个名不成吗?

为了不给Delphi添麻烦, 您就改个名吧!
 
你的企图是非法的,也是危险的,这种企图与面向对象编程思想中的数据封装性相违背,甚至连结构化编程中的数据局部化都违反了。

但是可以用别的变通的方法达到你的目的,比如临时变量的所有者将它作为一个参数传递给别的函数,不就可以供人访问了吗?
示例如下:
Type
TSomeClass = class;
TSomeClass = class(TObject)
public
ClassGlobalValue: Integer;
function SomeFunc(AClass:TSomeClass):Integer;
function Compute(AValue:Integer):Integer;
end;

implementation

function TSomeClass.SomeFunc(AClass:TSomeClass):Integer;
var
FuncLocalValue:Integer;
begin
Result:=AClass.Compute(FuncLocalValue);
end;

function TSomeClass.Compute(AValue:Integer):Integer;
begin
Result:=AValue+ClassGlobalValue;
end;
 
关于问题一:我认为不一定就没有办法解决。这种用法在实际当中很少遇到,但如果
一定要这样用,也没有什么不可以。程序就应改为:

function TSomeClass.SomeFunc(AClass: TSomeClass)
var Value: Integer;
begin
value:=1
//此处为局部变量
AClass.value:=23
//此处为tsomeclass的类变量
end;
本例中delphi不会混淆两个value,类的封装不会因为重名就会混乱,标识符更不会。
但如果本例中的somefunc函数无参数,第二行的value就没有了限定符,这样编译
程序无法区分两个value,而会一律认为是局部的value.
 
同意menxin的意见。
还可这样:
function TSomeClass.SomeFunc(AClass: TSomeClass)
var
Value: Integer;
begin
Value := 100
//当然是本函数局变量。
with AClass do
begin
SomeFunc.Valus := 10
// 这个可能不行
AClass.Valus := 5
// 这个一定能行!
// 这样访问函数的局部变量Value!
end;
end;
其它也可。如在Windows和System两个UNIT中都定义了ABC这个函数,而且
都被本过程引用,用时如何区别?可以:
Procedure F(b : Boolean);
begin
If b then
Windows.ABC
else
System.ABC;
end;
清楚了吗?
 
1。
如Self.Value := AClass.Value;
或 with AClass do begin
Self.Value := Value;
end;


2.
 
as for the first problem, as if it can not use the key "with".
under the sentence with the key "with" ,value =public value all the time.
if you must use local param , you may do like this:
aclass.vlaue ---public param;
value---local param
 
1。Turbo Pascal 的OOP编程中对该问题有较详尽的解答,希望你能翻一翻过去的
书籍看一下,我是记不清了!
 
Bright这家伙好象是消失了。
 
第二个问题,应该这样解决:

TClassTwo = class(TClassOne)
private
function GetItem: TObject;
public
property Item: TObject read GetItem;
end;

function TClassTwo.GetItem: TObject;
begin
result := inherited Item

end;
 
function TSomeClass.SomeFunc(AClass: TSomeClass)
var
Value: Integer;
begin
with AClass do begin
// 如何在此处访问函数的局部变量Value?可以嵌入汇编,Value肯定在某个寄
存器或栈中,是栈还是寄存器要看函数参数的个数和类型以及调用约定和是不使用
Stack Frame才能决定
end;
end;
 
花太多时间讨论第一个问题恐怕是理论意义大于实际意义,Inprise的Delphi开
发协议就指出应限制with语句的使用,只有在不会引起混淆的情况下才用,否则
将给排错和维护带来不少麻烦。Inprise的开发协议里头有不少好东东,他山之
石可以攻玉,值得瞧瞧,需要的同仁可以找我。
 
接受答案了.
 
拖了这么长的时间实在是对不起大家,我这里访问此站点实在太慢。这个问题实在已没有什么意思了,我今天特意结束它。
 

Similar threads

I
回复
0
查看
682
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
604
import
I
后退
顶部