Sobrecarga de métodos y herencia: ¿cómo dirigirse al método correcto?
Tengo la siguiente Factory:
public class ChildFactory : IChildFactory {
public Child? GetChild(ChildType childType)
{
switch (childType)
{
case ChildType.Boy:
return new BoyChild() { };
case ChildType.Girl:
return new GirlChild() { };
case ChildType.Undecided:
return new UndecidedChild() { };
default:
return null;
}
}
}
Cuando paso un ChildType
para generar un Child
, obtengo la instancia correcta de un niño:
Child? child = _childFactory.GetChild((ChildType)Enum.Parse(typeof(ChildType), childDto.Type));
Parece que en este punto, child
es del tipo correcto (digamos BoyChild
).
Ahora quiero validar dinámicamente cada uno de los tipos de niños por separado utilizando la sobrecarga de métodos. Aquí está la interfaz:
public interface IChildValidator
{
public ValidationResult Validate(BoyChild child);
public ValidationResult Validate(GirlChild child);
public ValidationResult Validate(UndecidedChild policy);
}
Pero cada vez que intento usarlo en el método anterior, obtengo el error CS1503: No se puede convertir de 'Child' a 'BoyChild'
.
Supongo que de alguna manera debo declarar child
de manera diferente, diciendo “Puede ser cualquiera de los tipos de niños”, pero no sé cómo hacerlo.
Gracias de antemano.
davy.ai
Para utilizar la interfaz
IChildValidator
con la variablechild
, puedes modificar la firma del método para aceptar cualquier tipo deChild
. Luego, puedes utilizar las palabras claveis
yas
para verificar el tipo específico del niño y llamar la sobrecarga apropiada del métodoValidate()
. Aquí tienes una versión modificada del código:En esta versión, el método
ValidateChild()
toma un parámetroChild?
en lugar deBoyChild
. Dentro del método, la palabra claveis
verifica el tipo de la variablechild
y la asigna a una nueva variable del tipo específico (BoyChild
,GirlChild
oUndecidedChild
) utilizando la palabra claveas
. Luego, se llama a la sobrecarga apropiada del métodoValidate()
con la nueva variable como parámetro.Ahora puedes llamar al método
ValidateChild()
con la variablechild
devuelta del métodoGetChild()
: