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

Ho il codice sopra il quale deve essere tradotto in C#. L'unica soluzione che sembra essere corretto è quello di rendere un class.From astratto quello che ho trovato è più sicuro da usare sola lettura di const:È la migliore opzione per convertire un'interfaccia java con campi statici in una classe astratta in C#?

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

     private readonly int INITIAL_CAPACITY = 149; 
    } 

Il progetto in Java sta usando il modello Decorator e Proxy, la trasformazione da java to C# può richiedere di usare più classi astratte (attualmente in java ci sono solo interfacce usate)? So teoricamente la differenza tra loro ma praticamente in C# ho usato più lezioni astratte. Non sono così familiare con java e vorrei Mi piacerebbe sapere il vostro consiglio su come trovare la soluzione migliore per completare questo compito, voglio dire i punti principali da tenere a mente quando si converte il codice.

+4

Per inciso, sembra sbagliato avere i campi che si menzione attaccato all'interfaccia (che è una specie di motivo per cui non è consentito in C#). Le interfacce non devono definire l'implementazione, i fattori di carico e le capacità iniziali sono dettagli di implementazione. Questi dovrebbero essere lasciati a un'implementazione specifica dell'interfaccia, non l'interfaccia stessa. –

+0

Piccola nota, non è necessario eseguire il cast per il float quando si assegna. Puoi ancora usare 0.7f; –

risposta

1

Definirei un'interfaccia con una proprietà get.
quindi, rendere la mia classe base implementarlo e impostare i valori predefiniti
e quindi estendere la classe base per ogni classe java che implementa l'interfaccia java.
qualcosa in queste righe:

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

Come suggerisco nel mio commento, non c'è modo di allegare campi (o altri dettagli di implementazione) a un'interfaccia in C#. Esistono due opzioni oltre a rendere questa una classe astratta:

  1. Rendere i campi in proprietà (probabilmente di sola lettura) sull'interfaccia, che imporrà a tutte le implementazioni di specificarli.
  2. Rendi i campi in attributi personalizzati definiti sull'interfaccia e/o sulle implementazioni.