学C++我看培训老师老说修改类里面的变量用函数修改,为什么delphi却相反直接改属性。
现在学QT感觉和学delphi的时候对于控件属性的修改完全是2种感觉,学c++用QT的时候培训老师都是特别强调类的变量值修改用函数来修改,说会影响变量值,也确实在QT中界面控件的属性全部用set+属性名的函数来修改值,比如LinEdit控件的txt值就用setTxt修改。 可是以前自己学delphi的时候都是控件属性直接赋值修改的,比如delphi中和QT的LinEdit控件一样的Edit控件,它就是比如 edit.txt:='修改值';看过很多编程语言也都说类的变量修改值用函数更安全,为什么delphi敢直接修改变量值,个人觉得delphi直接改更方便
封不封装都行吧 我理解的是,如果你的类会被别人用到的话,成员变量最好private,然后提供接口读写,在接口中也可以做一些有效性判断。避免用户使用的时候改坏,提升健壮性。
如果是自己用就无所谓吧,反正你知道啥时候改,应该如何改。 本帖最后由 goldli 于 2023-5-18 10:21 编辑
谁告诉你delphi的属性值修改是直接改变量值的 ?
任何高级语言,在支持对象的情况下, 对属性的修改都是通过赋值函数 Set{属性名} 来修改值。
你直接在对象外部能修改的应该是一个 public 的 对象字段,
如:
这个叫字段
public int Age ;
这个叫属性
private int _age; //属性对应的私有字段
public int Age {get {return _age;} set { _age = value;} } goldli 发表于 2023-5-18 10:16
谁告诉你delphi的属性值修改是直接改变量值的 ?
任何高级语言,在支持对象的情况下, 对属性的修改都是 ...
punlic
定义了一个变量不就是公有变量啊 delphi的属性也就是在pulic里面定义了private中私有变量可以读或写,这不就是可以给这个私有变量直接赋值的权限啊 而且delphi这样做对于还要搞个set函数不是更方便。
我是更喜欢delphi的做法 本帖最后由 dong555 于 2023-5-18 10:52 编辑
goldli 发表于 2023-5-18 10:16
谁告诉你delphi的属性值修改是直接改变量值的 ?
任何高级语言,在支持对象的情况下, 对属性的修改都是 ...
其实也像你说的这样间接赋值也比设置一个set函数 get函数方便多了吧
像你这个在delphi中就简洁多了,如果按照C++设置一个set函数 get函数
就要这样写2个函数觉得麻烦
private
intage;
public
void setAge(int a){age=a;}
int getAge(){return age;}
delhi这样写我看方便多了
private
age:integer;
published
property aaa:integer read age write age;
属性只是符号重载,懂C++的应该知道 确实,用property非常方便,对于简单字段完全不需要写get和set,对于相对复杂的,
可以这样:
type
TTest = class
private
FAge:Integer;
procedure SetAge(AValue:Integer);
public
property Age:Integer read FAge write SetAge; // 读取直接拿,写入通过SetAge
end;
procedure TTest.SetAge(AValue:Integer);
begin
// 这里就可以加入条件判断或做其他事情了
// if (AValue < 0) then xxxx
end
表面上你还是通过类似test.Age := 20; 这样的赋值,实际上调用的是SetAge
不过这样非常方便,写起来也比较符合逻辑。
你可以看看TEdit.Text,就是封装了TEdit.GetText和TEdit.SetText
本帖最后由 dong555 于 2023-5-18 11:16 编辑
DEATHTOUCH 发表于 2023-5-18 11:05
确实,用property非常方便,对于简单字段完全不需要写get和set,对于相对复杂的,
可以这样:
谢谢 c++的编译工具是不是都没有delphi的property这种操作,QT和VS好像都没有 不知道和delphi同根的c++ builder也有没有类似property的操作 dong555 发表于 2023-5-18 11:13
谢谢 c++的编译工具是不是都没有delphi的property这种操作,QT和VS好像都没有 不知道和delphi同根的c++ b ...
C++是没有property这种的,这个是Delphi的object pascal语言特有的,
不过QT有一个Q_PROPERTY宏,应该是QT自己的扩充,比如:
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged USER true)
这个就是我从QT的QLineEdit里面找到的,不过这个似乎不是给我们用的,你还是不能像Delphi那样用赋值语句。
不过对于C++ Builder来说就不一样了,他们魔改了自己的C++编译器,可以支持这种写法
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->Caption = "Hello";
}
比如上面的按钮代码就可以让窗口的标题变成Hello,这是因为他们的C++扩充了__property关键字,
__property int X = {read = readX, write = writeX};
比如上面这个就是从官方文档复制过来的。
页:
[1]
2