dong555 发表于 2023-5-18 09:38

学C++我看培训老师老说修改类里面的变量用函数修改,为什么delphi却相反直接改属性。

现在学QT感觉和学delphi的时候对于控件属性的修改完全是2种感觉,学c++用QT的时候培训老师都是特别强调类的变量值修改用函数来修改,说会影响变量值,也确实在QT中界面控件的属性全部用set+属性名的函数来修改值,比如LinEdit控件的txt值就用setTxt修改。   可是以前自己学delphi的时候都是控件属性直接赋值修改的,比如delphi中和QT的LinEdit控件一样的Edit控件,它就是比如 edit.txt:='修改值';
看过很多编程语言也都说类的变量修改值用函数更安全,为什么delphi敢直接修改变量值,个人觉得delphi直接改更方便

SysEntry 发表于 2023-5-18 09:53

封不封装都行吧

yes2 发表于 2023-5-18 10:16

我理解的是,如果你的类会被别人用到的话,成员变量最好private,然后提供接口读写,在接口中也可以做一些有效性判断。避免用户使用的时候改坏,提升健壮性。
如果是自己用就无所谓吧,反正你知道啥时候改,应该如何改。

goldli 发表于 2023-5-18 10:16

本帖最后由 goldli 于 2023-5-18 10:21 编辑

谁告诉你delphi的属性值修改是直接改变量值的 ?

任何高级语言,在支持对象的情况下, 对属性的修改都是通过赋值函数 Set{属性名} 来修改值。
你直接在对象外部能修改的应该是一个 public 的 对象字段,
如:
   这个叫字段
   public int Age ;

   这个叫属性
   private int _age; //属性对应的私有字段
   public int Age {get {return _age;} set { _age = value;} }

dong555 发表于 2023-5-18 10:32

goldli 发表于 2023-5-18 10:16
谁告诉你delphi的属性值修改是直接改变量值的 ?

任何高级语言,在支持对象的情况下, 对属性的修改都是 ...

punlic
定义了一个变量不就是公有变量啊 delphi的属性也就是在pulic里面定义了private中私有变量可以读或写,这不就是可以给这个私有变量直接赋值的权限啊 而且delphi这样做对于还要搞个set函数不是更方便。
我是更喜欢delphi的做法

dong555 发表于 2023-5-18 10:47

本帖最后由 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;

JuncoJet 发表于 2023-5-18 10:57

属性只是符号重载,懂C++的应该知道

DEATHTOUCH 发表于 2023-5-18 11:05

确实,用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:13

本帖最后由 dong555 于 2023-5-18 11:16 编辑

DEATHTOUCH 发表于 2023-5-18 11:05
确实,用property非常方便,对于简单字段完全不需要写get和set,对于相对复杂的,
可以这样:

谢谢 c++的编译工具是不是都没有delphi的property这种操作,QT和VS好像都没有 不知道和delphi同根的c++ builder也有没有类似property的操作

DEATHTOUCH 发表于 2023-5-18 11:31

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
查看完整版本: 学C++我看培训老师老说修改类里面的变量用函数修改,为什么delphi却相反直接改属性。