Parecería que lo que está tratando de lograr es tener una sola clase, es decir MyDropDownList
, ser capaz de heredar propiedades del DropDownList
, y para tener la clase MyCheckBox
heredar propiedades de la clase CheckBox
, mientras que tener tus dos clases My * tiene algunas propiedades adicionales, que son idénticas.
Como han sugerido otros, la manera más fácil de lograr esto sería a través de Multiple Inheritance. Específicamente en su ejemplo, eso significaría crear una clase (posiblemente abstract) que describa los atributos compartidos entre MyDropDownList
y MyCheckBox
, y luego tener esas dos clases heredadas de sus respectivas bases System.Web.UI.WebControls así como también esta "compartida". " clase. Sin embargo, como se ha dicho, C# doesn't support multiple inheritance. De Chris Brumme a través de ese enlace:
El número de lugares donde mi es realmente apropiada es en realidad muy pequeña. En muchos casos, la herencia de interfaz múltiple puede hacer el trabajo en su lugar. En otros casos, es posible que pueda usar encapsulación y delegación.
Es posible que también haya considerado usar Interfaces. Esto, como habrás descubierto, sería una elección inapropiada para tu solución como . Una interfaz solo te permite definir que hay ciertas propiedades y métodos en una clase, pero no cómo se definen las propiedades o los métodos. De nuevo, esta es una opción inapropiada para eliminar código duplicado.
¿Qué significa esto para usted? Bueno, si está buscando escribir una clase MyDropDownList
que admita las sintaxis myCustomDDLInstance.SelectedIndex
y myCustomDDLInstance.A
, tendrá que hacer un poco de "magia". ¡Pero el hecho de que su idioma no sea compatible con lo que está tratando de hacer debería levantar una bandera roja! No es necesariamente incorrecto, pero debería ser un indicador fuerte de que es posible que desee volver a examinar su diseño.
Supongo que la parte duplicada de las dos clases puede ser independiente ya que es una entidad lógica propia. Esto significa que puede crear justificadamente su propia clase para mantener estas propiedades y métodos compartidos. Esto es lo que obtenemos:
SampleControl.cs
public class SampleControl
{
public int A { get; set; }
public int B { get; set; }
public Collection<int> MysteryCollection
{
get
{
Collection<int> ints = new Collection<int>();
//........
return ints;
}
}
}
Si CSharp hizo apoyo en el hecho de la herencia múltiple, la clase MyDropDownList
podría heredar de ambos DropDownList
y SampleControl
y que estaría hecho. Pero, nuevamente, esto no es posible.
Entonces, ¿cómo logramos su objetivo? Es un poco intrincado, pero puede Encapsulate sus propiedades y métodos compartidos en cada una de sus clases personalizadas. He aquí un ejemplo para el MyDropDownList
clase (nota que MyCheckBoxList
sería lo mismo, sólo cambia el nombre de la clase:
public class MyDropDownList : DropDownList
{
private SampleControl mySampleControl { get; set; }
public int A
{
get
{
return mySampleControl.A;
}
set
{
mySampleControl.A = value;
}
}
public int B
{
get
{
return mySampleControl.B;
}
set
{
mySampleControl.B = value;
}
}
public MyDropDownList()
{
mySampleControl = new SampleControl();
}
protected override void OnLoad(EventArgs e)
{
//dummy task
this.DataSource = mySampleControl.MysteryCollection;
this.DataBind();
}
}
Una clase diseñada de esta manera, mientras que un poco complicado, debe cumplir con la sintaxis tipo que usted está buscando para.
Como nota final os animo encarecidamente a por lo menos posibilidad de volver a examinar su diseño y ver si hay una mejor manera para que pueda acercarse a su jerarquía de clases. Mi recomendación es que si sus atributos compartidos pueden existir por sí mismos como una entidad lógica, probablemente deberían ser su propia clase. Y si es así, esa clase es probab Es un miembro legítimo y lógico de sus clases MyDropDownList
y MyCheckBox
. Lo que significa que debe utilizar la sintaxis myDropDownListInstance.SharedAttributesClassName.A
. Es a la vez más explícito y más honesto.
+1 por esforzarse por reducir la redundancia en su código. Sin embargo, su pregunta puede ser más adecuada aquí: http://codereview.stackexchange.com/ –
@KileyNaro: Cool para aprender sobre la revisión del código, no sabía que existía. No creo que sea una mala coincidencia para SO tampoco. Buena pregunta, creo. +1 –