delphi 类方法、类变量、类常量、类属性的研究,自己的研究

本文详细解释了Delphi中类方法的特点与使用限制,对比实例方法,阐明了类方法无需实例化即可调用的特性,并通过示例代码展示了类方法与实例方法的区别。

群里我师傅给我的答案:

unit Unit4;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm4 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  /// <summary>
  /// 我曾经容易犯的错误理解:
  ///    Tperson再全局静态内存中 肯定得有个实例 才能 调用 function啊
  ///
  /// 知识点:
  ///   类方法是不需要初始化实例的
  ///   创建实例的时候
  ///   不是的,class function 类似于全局函数,只是挂名在这个类下面
  ///   class function 是不能访问Self的
  ///   Self都没有,当然也不能访问成员变量了
  ///   class 是类的方面,没有实例,就没有self
  /// </summary>
  TPerson = class
    //类常量得写在这里
    const hehe1 = 'hehe1';
  private
    Fname: string;
    class var Fname1: string;
    procedure Setname(const Value: string);
    class procedure Setname1(const Value: string); static;
    public
      /// <summary>
      /// 实例方法
      /// </summary>
      function sayName(): string;

      /// <summary>
      /// 类方法----class function 类似于全局函数
      /// </summary>
      class function sayName1(): string;

      /// <summary>
      /// 实例变量
      /// </summary>
      var cde: string;

      /// <summary>
      /// 类变量-----按理说那就是全局变量了
      /// </summary>
      class var cde1: string;

      /// <summary>
      /// 实例常量
      /// </summary>
      const hehe = 'hehe';

      /// <summary>
      /// 类常量 ------ 全局常量了(但是不能写在这里,要写在上面,写在这里会报错)
      /// </summary>
      //class const hehe1 = 'hehe1';

      /// <summary>
      /// 实例属性
      /// </summary>
      property name: string read Fname write Setname;

      /// <summary>
      /// 类属性
      /// </summary>
      class property name1: string read Fname1 write Setname1;
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}


procedure TForm4.Button1Click(Sender: TObject);
begin
  //TPerson.cde := 'wokao';这句会报错,因为没有实例 无法访问实例的变量
  TPerson.cde1 := 'wokao';
  ShowMessage(TPerson.cde1);
  ShowMessage(TPerson.hehe);//这句竟然也可以
  ShowMessage(TPerson.hehe1);
  //ShowMessage(TPerson.name);这句不可以
  ShowMessage(TPerson.name1);
end;

{ TPerson }

function TPerson.sayName: string;
begin
  //实例方法即可以访问类属性也可以访问正常的属性
  name := 'wokao';
  name1 := 'wokao1';
end;

class function TPerson.sayName1: string;
begin
  //类方法只能访问类属性
  name1 := 'wokao1';
  //这里会报错,因为没有实例,所以不能访问实例的属性.
  //name := 'wokao';
end;

procedure TPerson.Setname(const Value: string);
begin
  Fname := Value;
end;

class procedure TPerson.Setname1(const Value: string);
begin
  Fname1 := Value;
end;

end.

 

转载于:https://www.cnblogs.com/del88/p/5966594.html

<think>我们将在Delphi中实现一个简单的表达式解析。这个将能够解析包含数字、运算符(+、-、*、/)括号的数学表达式,并计算其结果。我们将使用递归下降分析法,这是一种自顶向下的解析方法。 步骤: 1. 定义 TExpressionParser。 2. 私有方法:用于解析表达式、项、因子等。 3. 使用一个字符串来存储表达式,一个当前位置索引来跟踪解析位置。 4. 支持的操作符:+、-、*、/,以及括号。 5. 支持整数浮点数。 我们将按照以下语法规则进行解析(使用递归下降): expression : term { ('+' | '-') term } term : factor { ('*' | '/') factor } factor : number | '(' expression ')' | '-' factor 注意:我们还要处理空白字符。 由于这是一个简单的示例,我们不会做详细的错误处理,但会确保基本功能。 实现: - 创建一个 TExpressionParser。 - 构造函数:传入表达式字符串。 - 方法:Evaluate,返回计算结果的Double值。 私有方法: - function GetChar: Char; // 获取当前字符,并跳过空白 - procedure NextChar; // 移动到下一个字符,跳过空白 - function ParseExpression: Double; // 解析表达式 - function ParseTerm: Double; // 解析项 - function ParseFactor: Double; // 解析因子 注意:我们还需要一个当前位置索引 FIndex 表达式字符串 FExpression。 开始编码:</think>### Delphi 实现表达式解析类方法Delphi 中实现似 `TExpressionParser` 的表达式解析,可以通过以下步骤完成: #### 1. 核心结构设计 ```delphi unit ExpressionParser; interface type TExpressionParser = class(TObject) private FExpression: string; FPos: Integer; // 当前解析位置 FCurrentToken: Char; // 词法分析 procedure NextToken; // 语法分析 function ParseExpression: Double; function ParseTerm: Double; function ParseFactor: Double; public function Evaluate(const AExpression: string): Double; end; ``` #### 2. 词法分析器实现 ```delphi procedure TExpressionParser.NextToken; begin // 跳过空白字符 while (FPos <= Length(FExpression)) and (FExpression[FPos] = ' ') do Inc(FPos); if FPos > Length(FExpression) then FCurrentToken := #0 // 结束符 else begin FCurrentToken := FExpression[FPos]; Inc(FPos); end; end; ``` #### 3. 递归下降解析器实现 ```delphi function TExpressionParser.ParseExpression: Double; var Value: Double; begin Value := ParseTerm; while FCurrentToken in ['+', '-'] do begin case FCurrentToken of '+': begin NextToken; Value := Value + ParseTerm; end; '-': begin NextToken; Value := Value - ParseTerm; end; end; end; Result := Value; end; function TExpressionParser.ParseTerm: Double; var Value: Double; begin Value := ParseFactor; while FCurrentToken in ['*', '/'] do begin case FCurrentToken of '*': begin NextToken; Value := Value * ParseFactor; end; '/': begin NextToken; Value := Value / ParseFactor; end; end; end; Result := Value; end; function TExpressionParser.ParseFactor: Double; begin if FCurrentToken = '(' then begin NextToken; Result := ParseExpression; if FCurrentToken <> ')' then raise Exception.Create('缺少右括号'); NextToken; end else if FCurrentToken in ['0'..'9'] then begin Result := 0; while FCurrentToken in ['0'..'9'] do begin Result := Result * 10 + (Ord(FCurrentToken) - Ord('0')); NextToken; end; end else raise Exception.Create('无效表达式'); end; ``` #### 4. 公开接口方法 ```delphi function TExpressionParser.Evaluate(const AExpression: string): Double; begin FExpression := AExpression; FPos := 1; NextToken; // 获取第一个token Result := ParseExpression; if FCurrentToken <> #0 then raise Exception.Create('未预期的字符: ' + FCurrentToken); end; ``` #### 5. 使用示例 ```delphi var Parser: TExpressionParser; Result: Double; begin Parser := TExpressionParser.Create; try Result := Parser.Evaluate('(5+3)*2-8/4'); ShowMessage(Format('结果: %.2f', [Result])); // 输出:结果: 14.00 finally Parser.Free; end; end; ``` ### 关键实现说明: 1. **词法分析**:`NextToken` 方法负责跳过空白字符并提取下一个有效 token 2. **语法分析**: - `ParseExpression` 处理加减运算 - `ParseTerm` 处理乘除运算 - `ParseFactor` 处理数字括号表达式 3. **运算符优先级**:通过递归层级实现,优先级顺序:括号 > 乘除 > 加减 4. **错误处理**:检测括号不匹配、无效字符等常见错误 ### 扩展建议: 1. 添加变量支持:使用字典存储变量值 2. 增加函数支持(如 SIN/COS) 3. 添加错误位置报告 4. 支持浮点数解析 5. 实现常量识别(如 PI) > 表达式解析的核心是理解编译原理中的词法分析递归下降解析技术。Delphi 的字符串处理能力面向对象特性使其非常适合实现这解析器[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值