2012-05-13 14 views
7

Sto lavorando alla programmazione di un lettore multimediale di base e sto avendo qualche problema a scrivere codice polimorfico, che è qualcosa che ho studiato, ma mai implementato prima.Polymorphism: derivante da un membro protetto in una classe base?

Esistono quattro classi rilevanti: MediaInfo, MovieInfo, Media e Film.

MediaInfo è una classe base astratta che contiene informazioni relative a tutti i file multimediali. MovieInfo eredita da MediaInfo e aggiunge alcune informazioni specifiche ai file video.

Il supporto è una classe base astratta che rappresenta tutti i file multimediali. Il film eredita dal media.

Ora, Media contiene la seguente riga di codice:

protected MediaInfo info; 

All'interno Media, io le funzioni di accesso che estraggono informazioni da MediaInfo. Tuttavia, all'interno del film, mi piacerebbe avere Accessors che estraggono anche informazioni da MovieInfo.

Quindi quello che ho fatto dentro film era:

protected MovieInfo info; 

E dentro il costruttore:

this.info = new MovieInfo(path); 

Tuttavia, ora ho una funzione di accesso:

/// <summary> 
/// Gets the frame height of the movie file. 
/// </summary> 
public string FrameHeight 
{ 
    get 
    { 
     return this.info.FrameHeight; 
    } 
} 

Il problema è, FrameHeight è un accessorio disponibile solo all'interno di MovieInfo. this.info è trattato come un MediaInfo, nonostante io l'abbia dichiarato come MovieInfo, quindi il codice genera un errore.

Per riassumere il mio problema in una domanda più generica: in una classe derivata, come faccio a derivare da una variabile di base protetta nella classe base?

Scusate se questo è stato un po 'di confusione, sarei felice di chiarire eventuali dettagli poco chiari.

risposta

6

Si potrebbe fare la classe base generica nel tipo di MediaInfo contiene:

public abstract class Media<T> where T : MediaInfo 
{ 
    protected T info; 
} 

Quindi è possibile specificare che Movie gestisce MovieInfo tipi:

public class Movie : Media<MovieInfo> 
{ 
    public string FrameHeight 
    { 
     get { return this.info.FrameHeight; } 
    } 
} 
+1

@Daniel - Penso che i generici siano l'unica soluzione (sicura per tipo) per la struttura che hai fornito. Potresti farlo in un modo non generico se potessi spostare il campo 'info' dalla classe' MovieInfo' e nelle sue sottoclassi. – Lee

1

Ecco un'alternativa non generica:

protected MovieInfo info { get { return (MovieInfo)base.info; } } 

Secondo sulla situazione, questo può o potrebbe non essere migliore della soluzione di Lee. Personalmente mi piace il suo meglio, solo pensando in generale.

Problemi correlati