Downcasting di classi

di il
5 risposte

Downcasting di classi

Salve, il mio problema è che non riesco a ottenere il downcasting di un array di classi derivate, il problema è che l'array di classi "Base" è ricavato da una libreria scritta a parte e non voglio modificarla, mentre io volevo implementare in un nuovo programma una nuova classe derivata per aggiungerci alcune funzioni. Il problema è che non voglio dover copiare tutti i singoli metodi e membri.
using System;
using System.Collections.Generic;
using System.Text;

namespace Castest
{
    public class Base
    {
        public int i = 0;
        public void methodA() { }
        public void methodB() { }
    }
    public class Derived : Base
    {
        public int j = 0;
        public void methodC() { }
    } 

    class Program
    {
        static void Main(string[] args)
        {
            Base[] bb = new Base[] { new Base(), new Base() };
            Derived[] cc = new Derived[2];

            for (int i = 0; i < 2; i++)
            {
                cc[i] = bb[i] as Derived;

            }

            foreach (Derived c in cc)
            {
                Console.WriteLine(c.i.ToString() + c.j.ToString());
            }
            Console.ReadKey();
        }
    }
}
come si può fare ? grazie.

5 Risposte

  • Re: Downcasting di classi

    Ciao johnwhile,
    puoi fare il downcasting di una classe solo se questa è effettivamente stata creata come classe derivata (cioè con una new Derived) altrimenti il cast fallisce.

    Un array di tipo Base può contenere sia oggetti dai tipo base che di tipo Derived, puoi scorrerlo e trovare gli oggetti Derived con l' operatore 'is' dopodiché puoi fare il cast.

    Comunque non ho capito bene cosa devi fare.
  • Re: Downcasting di classi

    Praticamente io ho fatto una libreria per lavorare con dei file di un gioco, sucessivamente ho voluto fare un programma con DirectX che crea oggetti 3d dai dati ricavati usando le funzioni della libreria.

    Nel caso specifico ottendo un array di classe "Base" dalla libreria, ma nel programma con DirectX vorrei semplicemente creare una equivalente classe "Derived" con implementato delle funzioni in più per fare il rendering ecc...

    La cosa potrebbe essere risolta in altro modo, ad esempio così:
    
            public class Base
            {
                public int i = 0;
                public void methodA() { }
                public void methodB() { }
            }
            public class Derived
            {
                public Base obj;
                public void methodC() { }
                public Derived(Base Obj) { this.obj = Obj; }
            }
    
    ma volevo comunque convertire senza troppe operazioni o creare nuove instance, ad esempio
                // uso normale della funzione per ottenere l'array oggetti
                Base[] oggetti = (Base[])Libreria.Funzione();
                // uso della funzione in altro programma
                Derived[] oggetti = (Derived[])Libreria.Funzione();
  • Re: Downcasting di classi

    Gli oggetti vengono creati nella libreria (e quindi sono di classe Base) oppure nel programma e quindi vengono creati come Derived?

    Il problema non sta tanto nel tipo dell' array ma nel tipo degli oggetti al momento della creazione.
  • Re: Downcasting di classi

    La libreria crea, restituisce e lavora con classi base, il programma dovrebbe aggiunge nuovi metodi alla classe base.
  • Re: Downcasting di classi

    Se gli oggetti vengono creati di tipo Base non ci sono storie, non puoi fare il cast a Derived.

    In C# esiste un sistema per aggiungere dei metodi ad una classe senza bisogno di farne un derivato, anche se è in una libreria, però puoi aggiungere solo metodi e non campi (nel tuo esempio invece aggiungevi anche campi per cui credo che questa strada non ti vada bene).

    Se puoi alterare il codice della libreria puoi inserire qualche meccanismo (pattern creazionali) per creare le classi nel programma che usa la libreria, in questo modo le creeresti di tipo Derived, la libreria le userebbe come Base, ma potresti sfruttare il polimorfismo e se serve fare pure il cast.
Devi accedere o registrarti per scrivere nel forum
5 risposte