El punto de disparo es si necesita o no acceder a variables privadas de cualquiera de esas clases, o propiedades que son específicas para ellas.
Cuando desee encapsular y compartir el comportamiento, utilice el Patrón de comando. Se ve algo como:
public interface ICommand {
void ExecuteOnPreRender(WebControl control, EventArgs args);
}
// This class encapsulates the functionality common
// to both OnPreRender commands
public class SharedPreRenderCommand : ICommand {
public void ExecuteOnPreRender(WebControl control, EventArgs args) {
// Modify the size, border, etc... any property that is
// common to the controls in question
}
}
public class RoleImageButton : ImageButton {
private ICommand onPreRenderCommand = null;
public void SetPreRenderCommand (ICommand command) {
onPreRenderCommand = command;
}
protected override void OnPreRender(EventArgs args) {
if (null != onPreRenderCommand) {
onPreRenderCommand.ExecuteOnPreRender(this, args);
}
else {
base.OnPreRender(args);
}
}
}
public class RoleButton : Button {
private ICommand onPreRenderCommand = null;
public void SetPreRenderCommand (ICommand command) {
onPreRenderCommand = command;
}
protected override void OnPreRender(EventArgs args) {
if (null != onPreRenderCommand) {
onPreRenderCommand.ExecuteOnPreRender(this, args);
}
else {
base.OnPreRender(args);
}
}
}
Esto le permite encapsular y extraer funcionalidad ... la limitación, por supuesto, es que no se puede tener acceso a los miembros privados o protegidos, o miembros específicos a RoleButton, etc., porque tienes que pasar una base común al comando. No poder acceder a los miembros específicos de RoleButton/RoleImageButton no debería ser un problema; su código no puede ser código común si utiliza algo específico para cualquiera de estos:)
Si tiene que acceder a miembros privados/protegidos, deberá crear una interfaz que exponga las propiedades e implementarlo por separado para tanto RoleButton como RoleImageButton, y pasan esa interfaz al comando ... pero básicamente estás forzando esas propiedades a ser públicas y hacerlas accesibles a otras clases. Si es absolutamente necesario que haga esto, puedo darle un código de muestra para mostrarle cómo, pero realmente no es una buena idea.
Lo que realmente buscas es herencia múltiple, un concepto que C# no admite.
EDITAR
Hay dos maneras de pelar este gato ...Lo recomendaría el primero, que es encapsular las variables que se van a cambiar en su mando y pasarlo como un parámetro, como por ejemplo:
// Encapsulate these fields if you want to be PC
public class Roles {
public bool PrimaryRole;
public bool SecondaryRole;
}
public class RoleButton: Button {
protected Roles buttonRoles;
...
}
public class SharedPreRenderCommand : ICommand {
public void ExecuteOnPreRender(WebControl control, Roles roles, EventArgs args) {
// Modify the Roles class, which the RoleButton or
// RoleImageButton has a handle to
}
}
otra parte, hacer la clase Roles una estructura y pase por ref. Esto le impide exponer sus roles, lo que le permite mantenerlos como protegidos. Todo lo demás del código de patrón de comando que escribí se usa tal cual.
El segundo enfoque ni siquiera vale la pena mencionarlo ... Lo abandonaré bajo coacción, pero es una mala idea, no me gustaría promocionarlo a menos que me torturaran. : D
HTH,
James
¿El() Código OnPreRender necesitan tener acceso a las variables privadas o protegidas en el botón, clases RoleButton, ImageButton o RoleImageButton? Supongo que sí, pero siempre hay esperanza ... –
JOC, ¿puedes publicar el código que se está duplicando en OnPreRender()? –
Agregué la implementación de clase completa :). Gracias – Vimvq1987