2012-03-23 16 views
7

Tengo una base de código que quiero usar tanto para ASP.NET MVC como para WPF/MVVM. Los objetos comerciales se implementan como interfaces y la lógica empresarial usa estas interfaces para pasar datos.¿Implementando propiedades de interfaz en interfaces?

Supongamos que tengo una propiedad en mi interfaz que implementa IEnumerable. ¿Es posible tener diferentes versiones de esta interfaz usando diferentes implementaciones de IEnumerable? Un ejemplo de lo que estoy tratando de lograr:

class Reporting 
{ 
    public bool RunReport(IReportParams Params); 
} 

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    public List<Guid> SelectedItems { get; set; } 
    public List<StatusEnum> SelectedStatuses { get; set; } 
} 

class WpfReportParams : IReportParams 
{ 
    public ObservableCollection<Guid> SelectedItems { get; set; } 
    public ObservableCollection<StatusEnum> SelectedStatuses { get; set; } 
} 

¿Se puede hacer esto?

Edit: También debería haber preguntado "cómo", porque cuando intento esto, tengo errores similares a esta:

'MvcReportParams' no implementa 'IReportParams.SelectedStatuses' miembro de interfaz. 'MvcReportParams.SelectedStatuses' no pueden implementar 'IReportParams.SelectedStatuses' porque no tiene el tipo de retorno de juego 'System.Collections.Generic.IEnumerable'

ObservableCollection y Lista tanto en términos absolutos implementar IEnumerable, y por lo que este no parece Tiene sentido para mi.

Última edición

Bueno, alguien publicó la respuesta, pero lo borró por alguna razón, por lo que no puede marcarlo como la solución. Esto es lo que terminé haciendo:

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    // Properties that the modelbinder dims and sets up 
    public List<Guid> SelectedItems { get; set; } 
    public List<StatusEnum> SelectedStatuses { get; set; } 

    // Explicityly implement my interface 
    IEnumerable<Guid> IReportParams.SelectedItems 
    { 
     get { return SelectedItems; } 
    } 

    IEnumerable<StatusEnum> IReportParams.SelectedStatuses 
    { 
     get { return SelectedStatuses; } 
    } 
} 

class WpfReportParams : IReportParams 
{ 
    // Properties that my view dims and modifies 
    public ObservableCollection<Guid> SelectedItems { get; set; } 
    public ObservableCollection<StatusEnum> SelectedStatuses { get; set; } 

    // Explicityly implement my interface 
    IEnumerable<Guid> IReportParams.SelectedItems 
    { 
     get { return SelectedItems; } 
    } 

    IEnumerable<StatusEnum> IReportParams.SelectedStatuses 
    { 
     get { return SelectedStatuses; } 
    } 
} 

Es más líneas de código reutilizable para escribir, pero me gusta ser más explícito de todos modos.

+0

Absolutamente. Sí. –

+1

Además, hubiera sido más rápido intentarlo que escribir una pregunta al respecto. –

+0

@Boo Justo lo que iba a decir Boo. Quizás esta es más una pregunta sobre la comprensión de por qué funciona (o no) en lugar de funcionar, ya que el compilador te dirá antes que el desbordamiento de la pila, no importa cuán rápido se responda :) – dreza

Respuesta

7

Probablemente implementaría esto con propiedades de solo lectura. Es mejor que el cliente agregue/elimine/actualice elementos en una colección existente en lugar de reemplazar la colección por completo.

interface IReportParams 
{ 
    IEnumerable<Guid> SelectedItems { get; } 
    IEnumerable<StatusEnum> SelectedStatuses { get; } 
} 

class MvcReportParams : IReportParams 
{ 
    public MvcReportParams() 
    { 
     SelectedItems = new Collection<Guid>(); 
     SelectedStatuses = new Collection<StatusEnum>(); 
    } 

    public IEnumerable<Guid> SelectedItems { get; private set; } 
    public IEnumerable<StatusEnum> SelectedStatuses { get; private set; } 
} 

class WpfReportParams : IReportParams 
{ 
    public WpfReportParams() 
    { 
     SelectedItems = new ObservableCollection<Guid>(); 
     SelectedStatuses = new ObservableCollection<StatusEnum>(); 
    } 

    public IEnumerable<Guid> SelectedItems { get; private set; } 
    public IEnumerable<StatusEnum> SelectedStatuses { get; private set; } 
} 
Cuestiones relacionadas