Có thể truyền phương thức của giao diện dưới dạng tham số không?Truyền phương thức của Giao diện làm tham số
Tôi đang cố gắng một cái gì đó như thế này:
interface
type
TMoveProc = procedure of object;
// also tested with TMoveProc = procedure;
// procedure of interface is not working ;)
ISomeInterface = interface
procedure Pred;
procedure Next;
end;
TSomeObject = class(TObject)
public
procedure Move(MoveProc: TMoveProc);
end;
implementation
procedure TSomeObject.Move(MoveProc: TMoveProc);
begin
while True do
begin
// Some common code that works for both procedures
MoveProc;
// More code...
end;
end;
procedure Usage;
var
o: TSomeObject;
i: ISomeInterface;
begin
o := TSomeObject.Create;
i := GetSomeInterface;
o.Move(i.Next);
// somewhere else: o.Move(i.Prev);
// tested with o.Move(@i.Next), @@... with no luck
o.Free;
end;
Nhưng nó không làm việc vì:
E2010 loại không tương thích: 'TMoveProc' và 'thủ tục, con trỏ không định kiểu hoặc tham số không kiểu'
Tất nhiên tôi có thể thực hiện phương pháp riêng cho từng cuộc gọi, nhưng điều đó thật xấu. Có cách nào tốt hơn không?
Delphi 2006
Edit: tôi biết rằng tôi có thể vượt qua toàn bộ giao diện, nhưng sau đó tôi phải xác định các chức năng sử dụng. Tôi không muốn hai thủ tục giống hệt nhau với một cuộc gọi khác nhau.
Tôi có thể sử dụng thông số thứ hai, nhưng điều đó cũng quá xấu.
type
SomeInterfaceMethod = (siPred, siNext)
procedure Move(SomeInt: ISomeInterface; Direction: SomeInterfaceMethod)
begin
case Direction of:
siPred: SomeInt.Pred;
siNext: SomeInt.Next
end;
end;
Cảm ơn tất cả sự giúp đỡ và ý tưởng. Giải pháp sạch (cho Delphi 2006) của tôi là Khách truy cập của Diego. Bây giờ tôi đang sử dụng đơn giản ("xấu xí") wrapper (của riêng tôi, cùng một giải pháp của TOndrej và Aikislave).
Nhưng đúng Câu trả lời là "không có (trực tiếp) cách để vượt qua các phương pháp giao diện như thông số mà không một số loại của nhà cung cấp.
Các mã trong TSomeObject.Move trông giống như một trường hợp sử dụng cho mẫu 'Chiến lược'. MoveProc có thể là một phương thức của một lớp TAbstractMoveProcStrategy, nơi các lớp con thực hiện hành vi được yêu cầu trong phương thức Move. TMovePredStrategy/TMoveNextStrategy sẽ có các procs Move khác nhau. – mjn