(Questo è probabilmente un dupe, ma in tal caso non l'ho ancora visto, anche se potrebbe essere Buone pratiche per incapsulare un parametro che richiede l'implementazione di più interfacce , ma quella domanda non risponde alla mia situazione)
Normalmente non mi interessa che c # abbia solo ereditarietà singola, ma mi sono imbattuto in qualcosa in cui penso che l'ereditarietà multipla in realtà migliorerebbe le cose, e non riesco a vedere un modo pulito per farlo con una singola eredità.
Questo deriva dal voler supportare sia INotifyPropertyChanged
che INotifyDataErrorInfo
in modo riutilizzabile. Queste interfacce sono indipendenti e richiedono una quantità non trascurabile di codice per supportarle, e fino ad ora ho considerato solo INotifyPropertyChanged
e ho un sistema di:
public class MyPropertyChangedBase : INotifyPropertyChanged
{
// re-usable code to support INotifyPropertyChanged
}
public MyViewModel : MyPropertyChangedBase
{
// various WPF bound properties that notify the UI on change
}
Tuttavia, ora voglio implementare INotifyDataErrorInfo
in modo riutilizzabile, ma il codice per supportare questa interfaccia è totalmente ortogonale e non correlato al codice INotifyPropertyChanged
. Quindi idealmente dovrebbero essere implementati in classi base non correlate e utilizzare l'ereditarietà multipla per il mio modello di vista. EG (nota che questo NON è codice c # valido - è solo per evidenziare una situazione 'idealistica'):
public class MyPropertyChangedBase : INotifyPropertyChanged
{
// re-usable code to support INotifyPropertyChanged
}
public class MyErrorChangedBase : INotifyDataErrorInfo
{
// re-usable code to support INotifyDataErrorInfo
}
public MyViewModel : MyPropertyChangedBase, MyErrorChangedBase
{
// various WPF bound properties that notify the UI on change and error
}
(Si noti che non posso usare la composizione per risolvere il problema, poiché dovrei mappare dai componenti alle istanze pubbliche degli elementi dell'interfaccia, che sposta semplicemente il problema e non lo risolve)
Quindi mi sembra che il codice INotifyPropertyChanged
si basi sul codice INotifyDataErrorInfo
o viceversa. EG
public class MyPropertyChangedBase : INotifyPropertyChanged
{
// re-usable code to support INotifyPropertyChanged
}
public class MyPropertyAndErrorChangedBase : MyPropertyChangedBase , INotifyDataErrorInfo
{
// re-usable code to support INotifyDataErrorInfo
}
public MyViewModel : MyPropertyAndErrorChangedBase
{
// various WPF bound properties that notify the UI on change and error
}
Questo affidamento di una classe indipendente a un'altra non mi sta bene. Quindi c'è un modo più pulito per farlo? O sono bloccato con esso?
Infine, riconosco che realisticamente non implementeresti INotifyDataErrorInfo
senza aver prima implementato INotifyPropertyChanged
, quindi la dipendenza di una classe dall'altra potrebbe essere un compromesso pragmatico. Ma sto ancora cercando di trovare il modo più pulito per farlo.