Trong Delphi XE2, tôi đang cố gắng quá tải toán tử in
trên bản ghi để cho phép tôi kiểm tra xem giá trị được đại diện bởi bản ghi có phải là một phần của tập hợp hay không. Mã của tôi trông giống như sau:Quá trình vận hành của nhà khai thác Delphi trong một tập hợp
type
MyEnum = (value1, value2, value3);
MySet = set of MyEnum;
MyRecord = record
Value: MyEnum;
class operator In(const A: MyRecord; B: MySet): Boolean;
end;
class operator MyRecord.In(const A: MyRecord; B: MySet): Boolean;
begin
Result := A.Value in B;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
R: MyRecord;
S: MySet;
begin
R.Value := value1;
S := [value1, value2];
Button1.Caption := BoolToStr(R in S);
end;
Mã không biên dịch được. Đối với tuyên bố R in S
trình biên dịch cho biết: Các loại không tương thích MyRecord
và MyEnum
.
Tôi làm cách nào để quá tải nhà điều hành In
trên MyRecord
để R in S
sẽ đánh giá True
trong mã ở trên?
Tôi không nghĩ rằng những gì bạn đang cố gắng đạt được là có thể ... bạn nên có may mắn hơn viết một ký tự phụ ".Value" => BoolToStr (R.Value in S); và được thực hiện với nó – ComputerSaysNo
Mã trong câu hỏi của tôi chỉ là một mẫu đơn giản. Trong ứng dụng thực tế của tôi, loại bản ghi không có sự tương ứng trực tiếp với loại thiết lập. Cách giải quyết mà tôi đã sử dụng là thêm một hàm 'InSet (S: MySet): Boolean' vào bản ghi và sử dụng nó thay vì toán tử' in'. –
có thể đủ tốt sẽ làm cho hàm thành viên thay thế - 'BoolToStr (R._in (S)); ' –