2015-01-13 16 views
5

Tôi đang cố gắng khai báo danh sách tùy chỉnh các giao diện mà từ đó tôi muốn kế thừa để có được danh sách các giao diện cụ thể (tôi biết về IInterfaceList, đây chỉ là một ví dụ). Tôi đang sử dụng Delphi 2007 vì vậy tôi không có quyền truy cập vào generics thực tế (đáng tiếc tôi).Làm cách nào để triển khai hai giao diện có phương thức có cùng tên?

Đây là một ví dụ đơn giản:

ICustomInterfaceList = interface 
     procedure Add(AInterface: IInterface); 
     function GetFirst: IInterface; 
    end; 

    TCustomInterfaceList = class(TInterfacedObject, ICustomInterfaceList) 
    public 
     procedure Add(AInterface: IInterface); 
     function GetFirst: IInterface; 
    end; 

    ISpecificInterface = interface(IInterface) 
    end; 

    ISpecificInterfaceList = interface(ICustomInterfaceList) 
     function GetFirst: ISpecificInterface; 
    end; 

    TSpecificInterfaceList = class(TCustomInterfaceList, ISpecificInterfaceList) 
    public 
     function GetFirst: ISpecificInterface; 
    end; 

TSpecificInterfaceList sẽ không biên dịch:

Tuyên bố E2211 của khác 'GetFirst' từ khai trong giao diện 'ISpecificInterfaceList'

Tôi đoán Tôi về mặt lý thuyết có thể sử dụng TCustomInterfaceList nhưng tôi không muốn phải đúc "GetFirst" mỗi khi tôi sử dụng nó. Mục tiêu của tôi là có một lớp cụ thể mà cả hai đều thừa kế hành vi của lớp cơ sở và kết thúc tốt đẹp "GetFirst".

Tôi làm cách nào để đạt được điều này?

Cảm ơn!

+2

có thể trùng lặp của [Cách ánh xạ tên giao diện cho các tên phương thức khác nhau?] (Http://stackoverflow.com/questions/1390552/how-to-map-interface-names-to-different-method-names) – RFerwerda

Trả lời

5

ISpecificInterfaceList xác định ba phương pháp. Chúng là:

procedure Add(AInterface: IInterface); 
function GetFirst: IInterface; 
function GetFirst: ISpecificInterface; 

Vì hai hàm của bạn có cùng tên, bạn cần giúp trình biên dịch xác định cái nào là cái nào.

Sử dụng số method resolution clause.

TSpecificInterfaceList = class(TCustomInterfaceList, ISpecificInterfaceList) 
public 
    function GetFirstSpecific: ISpecificInterface; 
    function ISpecificInterfaceList.GetFirst = GetFirstSpecific; 
end; 
+0

Tuyệt vời! Cảm ơn :) –

1

Không chắc chắn nếu điều này cũng có thể có trong Delphi7, nhưng bạn có thể thử sử dụng các điều khoản giải pháp phương pháp trong khai báo của bạn.

function interface.interfaceMethod = implementingMethod; 

Nếu có thể, điều này sẽ giúp bạn giải quyết xung đột đặt tên.

0

Đối với các phương pháp, bạn cũng có thể chọn ghi đè nếu thông số khác.

Ánh xạ chức năng giao diện rất khó nếu bạn có hậu duệ sau đó thực hiện giao diện hậu duệ khiến các chức năng này không được chuyển tiếp sang lớp tiếp theo làm phương thức giao diện và bạn cần phải remap chúng.

Các vấn đề liên quan