Posiadam bazę kodu, której chcę użyć zarówno dla interfejsu ASP.NET MVC, jak i dla interfejsu WPF/MVVM. Obiekty biznesowe są implementowane jako interfejsy, a logika biznesowa używa tych interfejsów do przekazywania danych.Implementowanie właściwości interfejsu w interfejsach?
Powiedz, że mam właściwość w moim interfejsie, która implementuje IEnumerable. Czy jest możliwe, aby różne wersje tego interfejsu używały różnych implementacji IEnumerable? Przykład tego, co próbuję wykonać:
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; }
}
Czy można to zrobić?
Edycja: Należy również zapytać „jak”, bo gdy próbuję to, że pojawiają się błędy podobne do tego:
„MvcReportParams” nie implementują „IReportParams.SelectedStatuses” członek interfejs. „MvcReportParams.SelectedStatuses” nie może realizować „IReportParams.SelectedStatuses”, ponieważ nie ma odpowiedniego rodzaju powrotny „System.Collections.Generic.IEnumerable”
ObservableCollection i Lista zarówno absolutnie wdrożenie IEnumerable, a więc to nie wydaje się sens dla mnie.
Last Edit
Cóż, ktoś pisał odpowiedź, ale usunął go z jakiegoś powodu, więc nie można oznaczyć go jako rozwiązanie. Oto, co skończyło się robi:
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; }
}
}
To więcej linii kodu boilerplate pisać, ale lubię być bardziej wyraźne i tak.
Absolutnie. Tak. –
Również szybciej byłoby po prostu spróbować, niż napisać pytanie na ten temat. –
@Boo Tylko co miałem zamiar powiedzieć Boo. Być może jest to raczej pytanie o zrozumienie, dlaczego działa (lub nie), a nie działa, jak kompilator powie ci wcześniej niż przepełnienie stosu, bez względu na to, jak szybko mu odpowiada :) – dreza