2012-05-13 46 views
7

Estoy trabajando en la programación de un reproductor multimedia básico, y estoy teniendo algunos problemas para escribir código polimórfico, que es algo que he estudiado, pero que nunca he implementado.Polimorfismo: ¿Deriva de un miembro protegido en una clase base?

Existen cuatro clases relevantes: MediaInfo, MovieInfo, Media y Movie.

MediaInfo es una clase base abstracta que contiene información relevante para todos los archivos multimedia. MovieInfo hereda de MediaInfo y agrega cierta información que es específica de los archivos de video.

Medios es una clase base abstracta que representa todos los archivos multimedia. La película hereda de Media.

Ahora, los medios de comunicación contiene la siguiente línea de código:

protected MediaInfo info; 

Dentro de los medios de comunicación, que tienen descriptores de acceso que extraen información de MediaInfo. Sin embargo, dentro de Movie, me gustaría tener Accessors que también extraigan información de MovieInfo.

Entonces lo que hice en el interior de la película fue:

protected MovieInfo info; 

Y dentro del constructor:

this.info = new MovieInfo(path); 

Sin embargo, ahora tienen un descriptor de acceso:

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

El problema es, FrameHeight es un accesorio solo disponible dentro de MovieInfo. this.info se trata como un MediaInfo, a pesar de que lo declare como un MovieInfo, por lo que el código genera un error.

Para resumir mi problema en una pregunta más genérica: en una clase derivada, ¿cómo puedo derivar de una variable base protegida en la clase base?

Disculpa si esto fue un poco confuso, con gusto aclararé cualquier detalle poco claro.

Respuesta

6

Se podría hacer la clase base genérica en el tipo de MediaInfo que contiene:

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

A continuación, se puede especificar que Movie maneja MovieInfo tipos:

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

@Daniel - Creo que los genéricos son la única solución (segura para el tipo) para la estructura que ha proporcionado. Podrías hacerlo de una forma no genérica si pudieras mover el campo 'info' de la clase' MovieInfo' y dentro de sus subclases. – Lee

1

Aquí es una alternativa no genérico:

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

Depende de en la situación, esto puede o no ser mejor que la solución de Lee. Personalmente me gusta que sea mejor, solo pienso en general.

Cuestiones relacionadas