es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para utilizar la interfaz IChildValidator con la variable child, puedes modificar la firma del método para aceptar cualquier tipo de Child. Luego, puedes utilizar las palabras clave is y as para verificar el tipo específico del niño y llamar la sobrecarga apropiada del método Validate(). Aquí tienes una versión modificada del código:

    public ValidationResult ValidateChild(Child? child)
    {
        if (child is BoyChild boy)
        {
            return _childValidator.Validate(boy);
        }
        else if (child is GirlChild girl)
        {
            return _childValidator.Validate(girl);
        }
        else if (child is UndecidedChild undecided)
        {
            return _childValidator.Validate(undecided);
        }
        else
        {
            throw new ArgumentException("Tipo de niño inválido");
        }
    }
    

    En esta versión, el método ValidateChild() toma un parámetro Child? en lugar de BoyChild. Dentro del método, la palabra clave is verifica el tipo de la variable child y la asigna a una nueva variable del tipo específico (BoyChild, GirlChild o UndecidedChild) utilizando la palabra clave as. Luego, se llama a la sobrecarga apropiada del método Validate() con la nueva variable como parámetro.

    Ahora puedes llamar al método ValidateChild() con la variable child devuelta del método GetChild():

    Child? child = _childFactory.GetChild((ChildType)Enum.Parse(typeof(ChildType), childDto.Type));
    ValidationResult result = ValidateChild(child);
    

Comments are closed.