Ciao a tutti,
la mia domanda è semplice: è possibile creare un vettore (o una lista (se sono implementate in c#) sarebbe ancora meglio) di oggetti istanziati da classi diverse? E se si come si può fare?
Grazie a tutti.
.Fakkio.
Ciao a tutti,
la mia domanda è semplice: è possibile creare un vettore (o una lista (se sono implementate in c#) sarebbe ancora meglio) di oggetti istanziati da classi diverse? E se si come si può fare?
Grazie a tutti.
.Fakkio.
Liste "generics" non se ne parla, sono tipizzate e accettano solo oggetti di un certo tipo e basta.
Le altre collection probabile ma per ciascun oggetto dovresti memorizzare anche il tipo rendendo più agevole l'estrazione
Porc.. Ci speravo.
Dovrò ingegnarmi in un altra maniera.
Puoi sempre creare una tua classe che come unico elemento espone una proprietà di tipo oggetto.
Su questa proprietà assegni il riferimento di un oggetto che vuoi appendere alla lista.
Poi appendi la tua classe alla lista, non credo ci saranno problemi.
Basta usare una normale lista non-generic (System.Collections.ArrayList), che quindi memorizza oggetti di tipo System.Object. Visto che tutti i tipi .NET ereditano da System.Object puoi sempre convertirli in questo tipo e quindi memorizzarli nella tua lista.Originariamente inviato da Fakkio
Ciao a tutti,
la mia domanda è semplice: è possibile creare un vettore (o una lista (se sono implementate in c#) sarebbe ancora meglio) di oggetti istanziati da classi diverse? E se si come si può fare?
Grazie a tutti.
.Fakkio.
Amaro C++, il gusto pieno dell'undefined behavior.
se ti serve fare una sorta di tipizzazione su una lista puoi semplicemente creare un'interfaccia e la fai ereditare a tutti i tipi che devono essere richiamati direttamente dalla lista, e puoi usare una semplice List<TuaInterfaccia> tipicizzata.Originariamente inviato da Fakkio
Ciao a tutti,
la mia domanda è semplice: è possibile creare un vettore (o una lista (se sono implementate in c#) sarebbe ancora meglio) di oggetti istanziati da classi diverse? E se si come si può fare?
Grazie a tutti.
.Fakkio.
se ad esempio a te serve che abbia una proprieta Name da leggere :
codice:using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { NameCollection listName = new NameCollection(); listName.Add(new Classe1()); listName.Add(new Classe2()); Console.WriteLine(listName[0].Name); Console.WriteLine(listName[1].Name); Console.ReadLine(); } } public interface IName { string Name { get; } } public class Classe1 : IName { #region IName Members public string Name { get { return "MioNome1"; } } #endregion } public class Classe2 : IName { #region IName Members public string Name { get { return "MioNome2"; } } #endregion } public class NameCollection : List<IName> { } }
EDIT : Mi piaceva ddi piu' cosi'![]()
Grazie U235,
questo dovrebbe risolvere il mio problema. Appena ho un po' di tempo lo provo (ora sono sotto esami).
Ho una domanda (forse stupida per uno che ne sa ma io sono alle prime armi con c# e con la programmazione oo): Posso fare lo stesso anche usando una classe invece che un interfaccia? E poi faccio ereditare dalla classe?
Grazie a tutti per le risposte!
ciao,Originariamente inviato da Fakkio
Grazie U235,
questo dovrebbe risolvere il mio problema. Appena ho un po' di tempo lo provo (ora sono sotto esami).
Ho una domanda (forse stupida per uno che ne sa ma io sono alle prime armi con c# e con la programmazione oo): Posso fare lo stesso anche usando una classe invece che un interfaccia? E poi faccio ereditare dalla classe?
Grazie a tutti per le risposte!
si puoi fare lo stesso con una classe, con la differenza che se lo fai con una classe non puoi ereditare da un altra classe.
mi spiego meglio :
poniamo che tu abbia una classe che eredita da form, e che quindi non puoi far ereditare dalla tua classe, come fai? non è possibile...
senza contare che con la classe devi scrivere tu il cod. mentre con l'interfaccia la fai ereditare punto e basta! immagina di avere una classe il cod. a te sconosciuto (libreria) ma che sai che ha una proprietà Nome da leggere, con un interfaccia puoi fare cosi :
public interface INome
{
string Nome {get;}
}
public class pippo : ClasseLibreria, INome
{
}
ora la classe pippo è sia un tipo ClasseLibreria sia INome
mentre con una classe cio' non è possibile in quanto puoi ereditare solo da una classe, quindi erediti o dalla libreria o la tua classe.
Scusate ma perchè tutto questo sbattimento per fare una lista dinamica di oggetti di tipo diverso? Come ha già detto MItaly ogni classe di .NET è figlia della classe Object. Tu fai un oggetto di tipo ArrayList che contiene in automatico oggetti di tipo Object, poi estrai il tipo dell'oggetto in base all'esigenza tramite la Reflection:
codice:class Program { static void Main(string[] args) { ArrayList lista = new ArrayList(); lista.Add("ciao"); lista.Add(32); lista.Add(14.5); lista.Add(new MioOggetto(1231219)); foreach (object obj in lista) { if (obj.GetType() == typeof(MioOggetto)) Console.Write((obj as MioOggetto).Telefono.ToString() + "\n"); else Console.Write(Convert.ChangeType(obj, obj.GetType()).ToString() + "\n"); } Console.Read(); } } public class MioOggetto { private int _tel; public int Telefono { get { return _tel; } set { _tel = value; } } public MioOggetto(int tel) { Telefono = tel; } }
![]()
Cerco ombrello vecchio, nuovo, moderno o antidiluviano; purché protegga da una pioggia che vien giù come Dio la manda. Fate presto che ho l’acqua alla gola. (Noè)
C# programming and other stuffs
Credo che fosse sottointeso che deve prendere ad esempio una proprietà da ogni classe che contiene lo stesso nome uguale per tutte le classi (anche se di tipo diverso), non la proprietà solo da alcuni oggetti che sono di un tipo prestabilito, diversamente la domanda non avrebbe senso...Originariamente inviato da chipdb
Scusate ma perchè tutto questo sbattimento per fare una lista dinamica di oggetti di tipo diverso? Come ha già detto MItaly ogni classe di .NET è figlia della classe Object. Tu fai un oggetto di tipo ArrayList che contiene in automatico oggetti di tipo Object, poi estrai il tipo dell'oggetto in base all'esigenza tramite la Reflection:
codice:class Program { static void Main(string[] args) { ArrayList lista = new ArrayList(); lista.Add("ciao"); lista.Add(32); lista.Add(14.5); lista.Add(new MioOggetto(1231219)); foreach (object obj in lista) { if (obj.GetType() == typeof(MioOggetto)) Console.Write((obj as MioOggetto).Telefono.ToString() + "\n"); else Console.Write(Convert.ChangeType(obj, obj.GetType()).ToString() + "\n"); } Console.Read(); } } public class MioOggetto { private int _tel; public int Telefono { get { return _tel; } set { _tel = value; } } public MioOggetto(int tel) { Telefono = tel; } }
![]()
mi spiego meglio :
supponi che lui voglia prendere il nome (dico il nome ma potrebbe essere una proprietà con lo stesso nome che restituisce lo stesso tipo, ma in oggetti di tipo diverso) da una classe di tipo classe1 che come proprietà "nome" restituisce string, poi lo stesso vuole fare con il tipo classe2 (sempre con una proprietà nome che restituisce string), poi con classe3 ecc. Ora visto e considerato che lui deve leggere "nome" da tutte, non ti sembra un vero sbattimento fare l 'if su tutti i tipi, poi convertirli e leggerne la proprietà? senza considerare il peso dell'operazione.
ad essere sincero non mi sembra uno sbattimento usare le interfacce...