Cast object

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)

Leave a comment

Please note that we won't show your email to others, or use it for sending unwanted emails. We will only use it to render your Gravatar image and to validate you as a real person.

o-MA-n-tjaz
o-MA-n-tjaz - četrtek, 29. marec 2007

lemmy to je stvar, ki jo jaz potrebujem. Hvala vsem za trud.Lp,Matjaž 

spirit1
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
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
MihaM - sreda, 28. marec 2007

Uporabi vmesnik, ki ga List<T> implementira (IList, ICollection, IEnumerable).

o-MA-n-tjaz
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
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
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;        }    }