Avere l'implementatore come una proprietà in un'interfaccia - è una cattiva pratica?

1

Ho un'interfaccia IFoo che viene implementata solo da oggetti con una classe base di livello abbastanza alto (framework). Sarebbe molto utile per me non solo ottenere i membri dell'interfaccia, ma anche l'oggetto di implementazione stesso. Sarebbe una cattiva pratica che l'interfaccia includa il suo implementatore come una proprietà?

Ad esempio:

public interface IFoo
{
  UIElement Implementer {get;}
  int Bar {get;}
}

public class FooTextBox : TextBox, IFoo
{
  public UIElement Implementer
  {    
    get{ return this;}
  }

  public int Bar
  {
    get{ return 5;}
  }
}

e quindi recuperandolo da qualche altra parte:

IFoo foo = GetIFoo();

var opac = foo.Implementer.Opacity;
    
posta Lennart 08.08.2016 - 09:31
fonte

1 risposta

1

No, non è davvero una cattiva pratica. Non c'è alcun problema con questo finché il codice che usa l'interfaccia IFoo non assume che il valore restituito non sia uguale al valore dell'istanza stessa. Per esempio. non esiste un codice che presupponga che (value as IFoo).Implementer == (value as UIElement) sia sempre true.

Ad esempio, invece del controllo utente che implementa un'interfaccia stessa e restituisce this , potrebbe esserci una classe separata (forse un ViewModel) che restituisce invece la sua vista. È lo stesso dettaglio dell'attuatore se vuole restituire sé stesso o qualcos'altro.

Nel tuo esempio Se dovessi rinominare Implementer in View , avrebbe molto più senso.

    
risposta data 08.08.2016 - 10:15
fonte

Leggi altre domande sui tag