C # ottiene la classe derivata dalla base

4

Sto cercando di creare una dashboard che permetta di visualizzare una varietà di widget sulla schermata principale. Sono strutturati come segue:

public abstract class Widget {}
public abstract class GraphWidget : Widget {}
public class PieWidget : GraphWidget : Widget {}
public class BarWidget : GraphWidget : Widget {}
public class TextWidget : Widget {}

Volevo assegnare al mio viewmodel una proprietà IENumerable<Widget> Widgets {get;set;} in modo da poterli scorrere ciclicamente sul dashboard e visualizzarli correttamente. Poiché sto usando JavaScript per visualizzare i grafici, il tipo di grafico determina il codice JavaScript che verrà emesso.

C'è un modo per scorrere tutti i widget, ma determinare quale tipo di widget è?

    
posta appsecguy 22.05.2015 - 14:51
fonte

2 risposte

5

Se vuoi separare la creazione di script java dai tuoi widget, puoi anche utilizzare il pattern visitor:

public interface IWidgetVisitor
{
    public void Visit(PieWidget widget);
    public void Visit(BarWidget widget);
    public void Visit(TextWidget widget);
    ...
}

public abstract class Widget
{
    public abstract void Accept(IWidgetVisitor visitor);
}

public class SomeWidget : Widget 
{
    public override void Accept(IWidgetVisitor visitor)
    {
        visitor.Visit(this);
    }
}

public class WidgetToJavaScriptConverter : IWidgetVisitor
{
    public void Visit(PieWidget widget)
    {
        // Do your conversion here
    }

    public void Visit(BarWidget widget)
    {
        // Do your conversion here
    }

    public void Visit(TextWidget widget)
    {
        // Do your conversion here
    }
    ...
} 
    
risposta data 22.05.2015 - 16:42
fonte
0

Certo che puoi. Puoi utilizzare la parola chiave is per verificare se un elemento nell'elenco è di un certo sottotipo. Questo di solito è un anti-pattern.

Oppure puoi implementare un metodo in ogni sottotipo che restituisce un identificatore che utilizzerai per decidere cosa fare con quell'elemento.

Oppure il metodo per ogni sottotipo può fare qualunque cosa tu ritenga opportuno per ottenere la funzionalità richiesta.

    
risposta data 22.05.2015 - 18:42
fonte

Leggi altre domande sui tag