2015-02-09 15 views
7
public enum HTTPHeaderKey { 
    CACHE_CONTROL("Cache-Control"), CONNECTION("Connection"), TRANSFER_ENCODING("Transfer-Encoding"), HOST("Host"), USER_AGENT("User-Agent"), CONTENT_LENGTH("Content-Length"), CONTENT_TYPE("Content-Type"); 
    private final String str; 

    private HTTPHeaderKey(final String _str) { 
     str = _str; 
    } 

    /** Over ridden toString returns the HTTP/1.1 compatible header */ 
    public String toString() { 
     return str; 
    } 
}; 

Próbuję przekształcić to wyliczenie w Delphi. Wiem, jak definiować zmienne wyliczeniowe, ale nie mam pojęcia, jak mogę wstawić metodę w enum?Metoda enum Java do Delphi

Czy ktoś może zaproponować inny sposób konwersji?

Odpowiedz

8

Możesz dostać się tam z pomocnikiem zapisu, który jest dostępny dla typów wartości od XE3. Na przykład:

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils, System.TypInfo; 

type 
    TMyEnum = (enumValue1, enumValue2); 

    TMyEnumHelper = record helper for TMyEnum 
    public 
    function ToString: string; 
    end; 

function TMyEnumHelper.ToString: string; 
begin 
    Result := GetEnumName(TypeInfo(TMyEnum), ord(Self)); 
end; 

begin 
    Writeln(enumValue1.ToString); 
    Writeln(enumValue2.ToString); 
end. 

Ten program wyświetla następujący:

 
enumValue1 
enumValue2 

Oczywiście może wolisz zrobić to tak:

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils, System.TypInfo; 

type 
    TMyEnum = (enumValue1, enumValue2); 

    TMyEnumHelper = record helper for TMyEnum 
    private 
    const 
     EnumNames: array [TMyEnum] of string = ('Friendly name 1', 'Friendly name 2'); 
    public 
    function ToString: string; 
    end; 

function TMyEnumHelper.ToString: string; 
begin 
    Result := EnumNames[Self]; 
end; 

begin 
    Writeln(enumValue1.ToString); 
    Writeln(enumValue2.ToString); 
end. 

Wyjście tutaj jest:

 
Friendly name 1 
Friendly name 2 

To przypuszczalnie pozwala ci poradzić sobie z faktem, że wyliczone typy Delphi nie obsługują tekstowego nazewnictwa dostępnego w Javie.

W innej metodzie konstruktor HTTPHeaderKey nie może być obsługiwany z typem wyliczeniowym. Powodem jest to, że wymaga stanu, a jedynym stanem dla wyliczonego typu Delphi jest sama wyliczona wartość typu. Nie można przeszukiwać dodatkowej zmiennej instancji, tak jak dzieje się to w kodzie Java.

Nie sądzę, aby podjęto próbę dosłownego tłumaczenia z wyliczonym typem. Proponuję, abyś przetłumaczył używając rekordu lub klasy i zbudował równoważną funkcjonalność używając dostępnych konstruktów językowych Delphi.

+1

Wow. Nie wiedziałem, że możesz używać pomocników rekordów na enums +1 –

+6

@markus_ja 20 minut temu Nie wiedziałem, że albo –

+0

dzięki za odpowiedź, mam to :) –

1

podstawie Davids odpowiedź, to zmodyfikowana wersja powinna być w stanie wydrukować nazwy nagłówka HTTP:

powinien wypisać

Cache-Control 
Transfer-Encoding