2009-09-20 15 views
6

Ahora tengo una clase base para mis páginas que hereda System.Web.UI.Page y otra clase base para mis controles de usuario que hereda System.Web.UI.UserControl, estas clases contienen los mismos métodos. Como C# no admite herencia múltiple, no puedo combinar las dos clases en una que herede tanto Page como UserControl.Clase base común para controles de usuario y páginas en ASP.NET

¿Cuál sería la mejor manera de mantener la funcionalidad en las dos clases base pero tener la implementación de estos métodos en un solo lugar?

Estoy pensando en hacer una interfaz y dejar que las dos clases base llamen a una tercera clase que contenga la implementación de la interfaz. ¿Hay alguna manera mejor para que cuando agregue un nuevo método no tenga que hacerlo en tres lugares (a pesar de que la implementación solo está en la tercera clase).

+0

¿Hay alguna razón por la que no solo cree una clase auxiliar que acepte un HttpContext en el constructor? Esto le dará la capacidad de hacer cosas como mirar la cadena de consulta y realizar Response.Redirects. – nizmow

+0

La pregunta original es sobre el httpContext, se trata de un código personalizado en las clases base de la página (un caso de uso común) que es DRY entre las páginas y los controles del usuario. Es bastante probable que los métodos en cuestión sean específicos de la lógica comercial y nada que ver con el contexto http. –

Respuesta

9

Si está utilizando C# 3.0, puede proporcionar sus métodos de ayuda como métodos de extensión para la clase System.Web.UI.Control, de los cuales derivan las clases System.Web.UI.Page y System.Web.UI.UserControl.

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

En el Page o UserControl:

this.DoSomething(); 
+0

¡Gran respuesta @Mehrdad! – ProfK

1

Hmm ... suena como el uso de los famosos Clases de ayuda, básicamente clases como

public static class StringHelper 
{ 

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

} 

y llamarlos como

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

Aunque a menudo estoy bastante preocupado por tener demasiados Helpers porque realmente recuerdan la programación de procedimientos con los métodos estáticos en ellos. Por otro lado, la funcionalidad que usted describe (en algunas clases base que extienden UserControl y Page) suele ser de este tipo.

Lo que a menudo hago es tener un StringHelper y un StringExtender correspondiente cuya lógica interna llama a los métodos estáticos de la clase Helper. De esta forma, puede usar la funcionalidad con los nuevos métodos de extensión C# o directamente a través de la clase estática, como siempre.

3

Tengo exactamente el mismo problema. Aquí está mi solución.

que define la interfaz vacío

public interface ISecurableWebObject 
    { 
    } 

Luego define la clase que tiene métodos para la interfaz extesion anteriores

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

heredé ISecurableWebObject en Página y WebUserControl clases definición tan dublicate ha ido.

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