Trong một lớp cơ sở, có một thủ tục được bảo vệ. Khi kế thừa lớp đó, tôi muốn ẩn thủ tục đó khỏi bị sử dụng từ bên ngoài. Tôi đã cố gắng ghi đè nó từ trong số riêng tư và thậm chí các phần riêng tư nghiêm ngặt nhưng vẫn có thể được gọi từ bên ngoài. Lớp gốc không phải của tôi, vì vậy tôi không thể thay đổi cách TOriginal
được xác định.Làm thế nào để ẩn một thủ tục được bảo vệ của một đối tượng?
Có thể ẩn quy trình này trong lớp được kế thừa của tôi không? Và làm thế nào?
type
TOriginal = class(TObject)
protected
procedure SomeProc;
end;
TNew = class(TOriginal)
strict private
procedure SomeProc; override;
end;
nếu bạn muốn ẩn phương pháp của lớp cơ sở từ lớp hậu duệ sau đó bạn phải khai báo nó trong phần riêng; các phương thức riêng tư chỉ hiển thị từ lớp tự; các phương thức được bảo vệ được hiển thị từ lớp của nó và các lớp thừa kế và cuối cùng là các phương thức công khai hoặc được xuất bản hiển thị cho tất cả mọi người; được xuất bản giống như công khai nhưng phần này được sử dụng bởi IDE delphi để tạo các đặc tính của các thành phần có thể nhìn thấy trong thanh tra đối tượng; – teran
cũng có hai thuật ngữ "ẩn" và "ghi đè"; trong ví dụ của bạn, bạn phải đánh dấu 'SameProc' trong lớp cơ sở là' virtual'; và sau đó bạn redeclare nó trong lớp kế thừa và đánh dấu nó là 'override' nó có nghĩa là trọng; điều này có nghĩa là nếu bạn tạo 'TNew' và gán thể hiện của nó cho biến' TOriginal' ('var orig: = TNew.Create()') và sau đó gọi orig.SomeProc thì thực hiện TNew.SomeProc sẽ được gọi; nếu bạn không đánh dấu nó là 'ghi đè' thì orig.SomeProc bằng' TOriginal.SomeProc' cũng là vô dụng để giảm khả năng hiển thị phương thức bởi vì bạn luôn có thể upcast và gọi – teran
tham chiếu lớp cơ sở hoặc gán chúng? Có được quyền truy cập vào bất kỳ phương thức "ẩn" nào không? Những gì bạn muốn không thể được thực hiện. Nếu bạn cảm thấy thôi thúc làm như vậy thì quan hệ thừa kế đều sai. – mghie