2009-09-20 15 views
6

In questo momento ho una classe base per le mie pagine che eredita System.Web.UI.Page e un'altra classe base per i miei usercontrols che eredita System.Web.UI.UserControl, queste classi contiene gli stessi metodi. Poiché C# non supporta l'ereditarietà multipla, non posso combinare le due classi in una che eredita sia Page che UserControl.Classe base comune per usercontrols e pagine in ASP.NET

Quale sarebbe il modo migliore per mantenere la funzionalità nelle due classi base ma avere l'implementazione di questi metodi in un'unica posizione?

Sto pensando di creare un'interfaccia e lasciare che le due classi base chiamino una terza classe che contiene l'implementazione dell'interfaccia. C'è un modo migliore in modo che quando aggiungo un nuovo metodo non devo farlo in tre punti (anche se l'implementazione è solo nella terza classe).

+0

C'è qualche ragione per cui non si crea semplicemente una classe helper che accetta un HttpContext nel costruttore? Questo ti darà la possibilità di fare cose come guardare la stringa di query ed eseguire Response.Redirects. – nizmow

+0

La domanda originale riguarda il httpContext, riguarda il codice personalizzato nelle classi di base della pagina (un caso d'uso comune) che è ASCIUTTO tra pagine e controlli utente. È probabile che i metodi in questione siano specifici della logica aziendale e nulla a che fare con il contesto http. –

risposta

9

Se si utilizza C# 3.0, è possibile fornire i metodi di supporto come metodi di estensione per la classe System.Web.UI.Control, di cui derivano entrambe le classi System.Web.UI.Page e System.Web.UI.UserControl.

public static class ControlExtensions { 
    public static void DoSomething(this Control obj) { 
     // do something 
    } 
} 

Nel Page o UserControl:

this.DoSomething(); 
+0

Ottima risposta @ Mehrdad! – ProfK

1

Hmm ... suona come l'utilizzo delle famose classi di supporto, in fondo classi come

public static class StringHelper 
{ 

    public static string Replace(...) 
    { 
     ... 
    } 

} 

e chiamarli come

string x = StringHelper.Replace(...); 

Anche se sono spesso piuttosto preoccupato di avere troppi di questi Helpers perché in qualche modo ricordano in qualche modo la programmazione procedurale con i metodi statici in essi contenuti. D'altra parte, tali funzionalità come la descrivi (in alcune classi base che estendono UserControl e Page) sono solitamente di questo tipo.

Quello che spesso faccio è avere un StringHelper e un StringExtender corrispondente la cui logica all'interno chiama i metodi statici della classe Helper. In questo modo è possibile utilizzare la funzionalità con i nuovi metodi di estensione C# o direttamente attraverso la classe statica come al solito.

3

Ho esattamente lo stesso problema. Ecco la mia soluzione.

ho definito un'interfaccia vuota

public interface ISecurableWebObject 
    { 
    } 

Poi ho definito classe che ha metodi extesion per l'interfaccia di cui sopra

public static class ISecurableWebObjectExtender 
    { 
     public static bool ExtensionMetotX(this ISecurableWebObject obj) 
     { 
      return ...; 
     } 
    } 

ho ereditato ISecurableWebObject nella pagina e WebUserControl classi definizione così dublicate è andato.

public partial class UcExample : System.Web.UI.UserControl, ISecurableWebObject 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if(this.ExtensionMetotX() == true) 
      { ... } 
     } 
    } 
Problemi correlati