2013-07-27 22 views
9

tôi đã tạo helper này để thêm một số chức năng hơn với string loại:Có thể sử dụng hai trình trợ giúp bản ghi cho loại chuỗi không?

type 
    AStringHelper = record helper for string 
    function Invert: string; overload; 
    function InvertMe: string; overload; 
    end; 

Nhưng khi tôi sử dụng nó trong mã của tôi, TStringHelper trong System.StrUtils "được ra khỏi" và tôi không thể sử dụng nó là chức năng .

Có thể cả hai người cùng tồn tại?

+1

FWIW, Đảo ngược là tên thường được sử dụng hơn cho những gì tôi cho là chức năng của bạn. –

+0

Tôi đã từng sử dụng Reverse ... – PSyLoCKe

Trả lời

11

Tối đa một người trợ giúp có thể hoạt động tại bất kỳ điểm nào trong mã của bạn. documentation nói điều này:

Bạn có thể xác định và kết hợp nhiều người trợ giúp với một loại . Tuy nhiên, chỉ có 0 hoặc một người trợ giúp được áp dụng ở bất kỳ vị trí cụ thể nào trong mã nguồn của . Người trợ giúp được xác định trong phạm vi gần nhất sẽ được áp dụng. Phạm vi trợ giúp lớp hoặc bản ghi là được xác định theo kiểu Delphi bình thường (ví dụ, phải để bỏ qua trong điều khoản sử dụng của đơn vị).

Vì người giúp đỡ bản ghi không hỗ trợ kế thừa, không có cách nào để có cả chức năng trợ giúp chuẩn và chức năng trợ giúp của bạn cùng một lúc, ngoại trừ việc thực hiện lại chức năng của trình trợ giúp chuẩn.

+0

Thật vậy, việc thực hiện lại sẽ dễ dàng nhất, đơn giản bằng cách sử dụng các hàm TStringHelper để triển khai thực hiện lại, IOW sử dụng tập hợp thay vì thừa kế. –

+0

@RudyVelthuis: Bạn muốn thực hiện lại điều gì? Bạn có thể đưa ra một ví dụ không? –

+0

Chỉ cần viết một trình trợ giúp chuỗi mới và sử dụng trình trợ giúp chuỗi hiện có để triển khai nó. Vấn đề là một người trợ giúp không thể có các biến cá thể riêng của nó. –

2

Một giải pháp đơn giản này có thể là:

type 
    TStr = record 
    private 
    FStr:string; 
    public 
    function Invert: string; overload; 
    function InvertMe: string; overload; 
    end; 

Bằng việc sử dụng loại đúc bạn có thể truy cập vào các chức năng trên TStr trên bình thường string biến:

var 
    s1,s2:string; 
begin 
    s1:='123456'; 
    s2:=TStr(s1).invert; 
end; 

Nhưng tất nhiên, sau đó chúng ta có thể hỏi: Tại sao không chỉ viết một hàm bình thường? :-)

Dù sao, tôi thích cú pháp phương pháp này class/object/record phương pháp tốt hơn so với chức năng/quy trình truyền thống.

+0

Bởi vì các dudes nghĩ rằng phương pháp đối tượng này là tốt hơn và chúng ta không nên sử dụng chúng hỗn hợp với các cuộc gọi chức năng trực tiếp. : - / – PSyLoCKe

2

Cố gắng tạo lớp của riêng bạn và helper

TMyString = type string; 
TMyStringHelper = record helper for TMyString 
    function Invert: TMyString; 
    function ToString: string; 
end; 

Sử dụng TMyString thay vì String.

Để sử dụng trình trợ giúp chuỗi chuẩn, hãy bọc biến TMyString bằng String() hoặc sử dụng phương thức ToString.

var 
    S1: TMyString; 
    S2: String; 
begin 
    S1 := ' 123456 '; 
    S1.Invert; 
    S2 := String(S1).Trim; 
    S2 := S1.ToString.Trim; 
end; 
Các vấn đề liên quan