Chiama i metodi di sottoclasse durante l'iterazione sulla raccolta del tipo di base [duplicato]

0

Immagina questo codice:

using System;

public enum BaseClassType
{
    DerivedA,
    DerivedB
}

public abstract class BaseClass
{
    public BaseClassType Type;

    public BaseClass(BaseClassType type)
    {
        Type = type;
    }

    public virtual void Interact()
    {
        Console.WriteLine("BaseClass.Interact()");
    }
}

public class DerivedA : BaseClass
{
    public DerivedA() : base(BaseClassType.DerivedA) {}

    public void SomeMethodA(int signature0, float signature1)
    {
        Console.WriteLine("DerivedA.SomeMethodA");
    }
}

public class DerivedB : BaseClass
{
    public DerivedB() : base(BaseClassType.DerivedB) {}

    public void SomeMethodB(float signature0)
    {
        Console.WriteLine("DerivedB.SomeMethodB");
    }
}

public class Test
{
    public static void Main()
    {
        BaseClass[] elements = new BaseClass[] { new DerivedA(), new DerivedB() };
        foreach (var element in elements)
        {
            switch (element.Type)
            {
                case BaseClassType.DerivedA:
                    (element as DerivedA).SomeMethodA(5, 5f);
                    break;
                case BaseClassType.DerivedB:
                    (element as DerivedB).SomeMethodB(3f);
                    break;
            }
        }
    }
}

Mi chiedo quale sia il miglior modo OOP per sbarazzarsi di questo tipo di interruttore? Forse qualche schema? I metodi delle sottoclassi hanno firme completamente diverse, quindi non posso estrarlo e renderlo virtuale nella classe base.

    
posta GuardianX 15.09.2015 - 13:36
fonte

1 risposta

1

Se le sottoclassi hanno metodi con tipi e valori diversi come parametri, allora quelli non sono gli stessi metodi. Dovrebbero essere incapsulati dietro un comune metodo ereditato che sa cosa è appropriato per la classe concreta.

Se non è possibile per la sottoclasse ottenere questi valori, la gerarchia delle classi è imperfetta: la sottoclasse dovrebbe esprimere una specializzazione di un tipo che differisce in alcune specifiche, ma non lo sa questi dettagli! Questo non è qualcosa che un modello di progettazione può risolvere: devi ridisegnare i limiti della classe nel tuo sistema per rendere i tipi adatti al tuo dominio aziendale

    
risposta data 15.09.2015 - 13:40
fonte

Leggi altre domande sui tag