2015-04-26 32 views
5
public interface IHashStorage<T> { 
    public static final float INITIAL_LOAD_FACTOR = 0.7f; 
    public static final int INITIAL_CAPACITY = 149; 
} 

Mam powyższy kod, który należy przetłumaczyć w języku C#. Jedynym rozwiązaniem wydaje się być właściwe jest, aby to abstrakcyjne class.From co znalazłem to bezpieczniej jest używać tylko do odczytu niż const:Czy jest to najlepsza opcja do przekonwertowania interfejsu java na pola statyczne w klasie abstrakcyjnej w języku C#?

public abstract class IHashStorage<T> 
    { 
     private readonly float INITIAL_LOAD_FACTOR = (float)0.7; 

     private readonly int INITIAL_CAPACITY = 149; 
    } 

Projekt w Javie korzysta Wzorzec Dekorator i Proxy, transformacja z java to C# może wymagać użycia bardziej abstrakcyjnych klas (obecnie w java są używane tylko interfejsy)? Wiem teoretycznie różnicę między nimi, ale praktycznie w C# użyłem abstrakcyjnych klas więcej. Nie jestem zaznajomiony z java i chciałbym lubię znać twoją radę, jak znaleźć najlepsze rozwiązanie, aby dokończyć to zadanie, mam na myśli główne punkty, o których warto pamiętać przy konwersji kodu.

+4

Tak na marginesie, wydaje się źle mają pola, które można wymienić dołączone do interfejsu (który niby dlaczego nie wolno w C#). Interfejsy nie powinny definiować implementacji, a współczynniki obciążenia i pojemności początkowe są szczegółami implementacji. Należy je pozostawić do określonej implementacji interfejsu, a nie samego interfejsu. –

+0

Mała uwaga, nie trzeba rzutować, aby unosić podczas przypisywania. Nadal możesz używać 0.7f; –

Odpowiedz

1

Zdefiniowałbym interfejs z właściwością get.
następnie, spraw, aby moja klasa podstawowa zaimplementowała je i ustaw domyślne wartości
, a następnie rozszerz klasę podstawową dla każdej klasy java, która implementuje interfejs java.
coś wzdłuż tych linii:

public interface IHashStorage<T> 
{ 
    float InitialLoadFactor { get; } 
    int InitialCapacity { get; } 
} 

public class HashStorageBase<T> : IHashStorage<T> 
{ 
    private readonly float _initialLoadFactor = 0.7f; 
    private readonly int _initialCapacity = 149; 
    public float InitialLoadFactor 
    { 
     get { return _initialLoadFactor; } 
    } 

    public int InitialCapacity 
    { 
     get { return _initialCapacity; } 
    } 
} 

public class HashStorage1<T> : HashStorageBase<T> 
{ 
    ... 
} 
1

Jak sugeruję w moim komentarzu, nie ma możliwości dołączenia pól (lub jakichkolwiek innych szczegółów implementacji) do interfejsu w języku C#. Masz dwie opcje, poza tym, że jest to klasa abstrakcyjna:

  1. Utwórz pola w (prawdopodobnie tylko do odczytu) właściwości interfejsu, co zmusi wszystkie implementacje do ich określenia.
  2. Utwórz pola dla niestandardowych atrybutów zdefiniowanych w interfejsie i/lub implementacjach.