Imam sledeč problem. Kot parameter funckije dobim spremeljivko (object spr) potem pa bi jo rad cast-a v objekt "pravega" tipa glede na to kaj dejansko je spr. Zato da bi v nadaljevanju klical funkcijo iz pravega razreda (odvino katerega tipa bi bila sprNew).
???? sprNew;
if (spr is Object1)
sprNew = (Object1)spr;
else
sprNew = (Object2)spr;
Avtor: o-MA-n-tjaz, objavljeno na portalu SloDug.si (Arhiv)
o-MA-n-tjaz - četrtek, 29. marec 2007
lemmy to je stvar, ki jo jaz potrebujem. Hvala vsem za trud.Lp,Matjaž
spirit1 - četrtek, 29. marec 2007
ok ce imas List<T> sklepam da so vsi tvoji objekti isti oziroma dedovani iz istega razreda inti hoces dobit ven ta prave dedovane objekte?ce je to res potem je najboljsi in najhitrejsi nacin da uporabis iteratorje in njihov yield return statement.google da kopico primerov.
lemmy - četrtek, 29. marec 2007
Zivjo,ne razumem povsem tvojega problema, zato mi prosim ne zameri, ce je spodnja resitev povsem neuporabna. Na kratko si predstavljam, da imas mnozico razredov, katerih objekte spravljas v razlicne sezname. Sedaj bi pa na teh seznamih zelel nekaj narediti, v odvisnosti od tipa objekta. Jaz bi se tega lotil tako, da bi vpeljal vmesnik (ce ga se nimas), ki ga vsak od uporabljenih razredov izpelje. Nato pripravis eno genericno metodo, ki sprejme List<T> in na vsakem elementu poklice metodo vmesnika. Torej, nekako takole: public interface ITest { void DoTheMagic(); } // interface ITest public class Class1 : ITest { private int i; public Class1(int _i) { this.i = _i; } // Class1 #region ITest Members public void DoTheMagic() { System.Diagnostics.Debug.WriteLine("My i: " + this.i); } // DoTheMagic #endregion } // class Class1 public class Class2 : ITest { private string str; public Class2(string _str) { this.str = _str; } // Class1 #region ITest Members public void DoTheMagic() { System.Diagnostics.Debug.WriteLine("My str: " + this.str); } // DoTheMagic #endregion } // class Class1 Sedaj imas na voljo vmesnik in dva implementorja, ki na svoj nacin postorita reci, ki jih zelis. Implementiraj se metodo, ki se sprehodi cez vse elemente: private void TestList<T>(List<T> _list) { foreach (T item in _list) { ((ITest)item).DoTheMagic(); } // foreach } // TestListZa konec se kratek testni programcek List<Class1> list1 = new List<Class1>(); list1.Add(new Class1(2)); list1.Add(new Class1(4)); list1.Add(new Class1(6)); List<Class2> list2 = new List<Class2>(); list2.Add(new Class2("test1")); list2.Add(new Class2("test2")); list2.Add(new Class2("test3")); this.TestList(list1); this.TestList(list2);V vednost, lahko naredis celo vec: List<ITest> list = new List<ITest>(); list.Add(new Class1(2)); list.Add(new Class2("test")); this.TestList(list);Torej, list, ki vsebuje objekte, ki implementirajo tvoj vmesnik... Ce je vse tole povsem zgreseno, te prosim, da podas konkretnejsi opis.Srecno,Gregor
MihaM - sreda, 28. marec 2007
Uporabi vmesnik, ki ga List<T> implementira (IList, ICollection, IEnumerable).
o-MA-n-tjaz - sreda, 28. marec 2007
Takole bi šlo samo me moti ker bi bil precejšen del kode podvojen. V tem primeru se podvaja samo koda sprNew*.Metoda(). V mojem primeru ko sta objekta vbistvu listi objektov (Object1 = List<Object1> oz. Object2 = List<Object2>) in se v nadaljevanju v kod sprehajam po listi pa kličem funkcije na Object1 ali Object2 in se sklicujem na propertije bi pa morali biti if in else vej precej dalši koda bi bila pa v obeh vejah enaka razen klic konstruktorja.Lp,Matjaž
AndrejT - sreda, 28. marec 2007
Nekaj tvojemu primeru podobnega bi lahko naredil, ko sta Object1 in Object2 izpeljana iz istega razreda ali implementirata isti vmesnik. V tem primeru je ???? ime tega razreda ali vmesnika. Druga možnost je pak inicializacija nove spremenljivke: if (spr is Object1){ Object1 sprNew1 = (Object1)spr; sprNew1.Metoda();}else{ Object2 sprNew2 = (Object2)spr; sprNew2.Metoda();}Lahko se tudi izogneš castanju in kličeš metode na svojemu objektu s pomočjo Reflectiona. Tu tip ni pomemben, paziti pa moraš, da objekt pozna klicano metodo, na koncu pa bo zadeva tudi nekolikanj počasnejša.
F34R - sreda, 28. marec 2007
Ok in kje je problem pravzaprav?a si imel tole v mislih:class Program { static void Main(string[] args) { Objekt1 o1 = new Objekt1(); Objekt2 o2 = new Objekt2(); Ident(o1); Ident(o2); Console.ReadLine(); } static void Ident(Object o) { if (o is Objekt1) { Console.WriteLine("To je objekt1"); ZaO1(o as Objekt1); } else if (o is Objekt2) { Console.WriteLine("To je objekt 2"); ZaO2(o as Objekt2); } else Console.WriteLine("Neznan objekt"); } static void ZaO1(Objekt1 o) { Console.WriteLine(o.Kdo()); } static void ZaO2(Objekt2 o) { Console.WriteLine(o.Kdo()); } } public class Objekt1 { private string ime; public Objekt1() { ime = "Objekt 1"; } public string Kdo() { return ime; } } public class Objekt2 { private string ime; public Objekt2() { ime = "Objekt 2"; } public string Kdo() { return ime; } }