Virtualni razred

Naprogramiral sem razred (Razred) v katerem imam implementriranih nekaj virtualnih metod. Naprogramiral sem še 2 razreda (Razred1:Razred in Rezred2:Rezred), ki dedujeta ta virtualni razred. Ne vem pa kako bi sprogramiral, da bi ta dva razreda klical (kreiral) na enak način. Nekako tako Razred r = new Razred(type). Če bi bil type naprimer 0 bi r "delal" z objektom Razred1, če bi bil type 1 bi r "delal" z objektom Razred2.

 

Hvala

Matjaž 

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.

AndrejT
AndrejT - petek, 29. december 2006

Lahko metodo narediš statično in se greš factoring:public abstract class Razred{    public static Razred CreateRazred(int type)    {        if (type == 0)        {            return new Razred1();        }        else        {            return new Razred2();        }    }    ....}Kličeš z Razred r = Razred.CreateRazred(0);

o-MA-n-tjaz
o-MA-n-tjaz - petek, 29. december 2006

Tako rešitev sem imel že sam. To pomeni, da klica ne moreš izvršiti v emem koraku:Razred r = new Razred(1);ampak v dveh:Razred r = new Rezred();r = r.DajMiRazred(1); 

bojanv
bojanv - petek, 29. december 2006

Samo kot dodatek post-u AndrejT , lahko namesto tip uporabiš enumeracijo. Npr. ClassType pa preko tega delaš... public Razred DajMiRazred(ClassType type){    if (type == ClassType.Razred1)    {        return new Razred1();    }    else    {        return new Razred2();    }} 

AndrejT
AndrejT - petek, 29. december 2006

Tole je razširjen, vendar poenostavljen odgovor, če bo pomagalo...public Razred DajMiRazred(int type){    if (type == 0)    {        return new Razred1();    }    else    {        return new Razred2();    }}Klici... Razred r = DajMiRazred(0);inRazred r = DajMiRazred(1);

o-MA-n-tjaz
o-MA-n-tjaz - petek, 29. december 2006

Najbrš res nisem najbolje razložil. Rad bi naredil, da bi imel globalno spremenljivko (na nivoju projekta) s katero bi določil ali bom v programu uporabljal Razred1 ali Razred2. Povsod v programu pa bi se skliceval v obeh primerih enako (Razred).Razred1 naj bi kominiciral z enim tipom baze, Razred2 pa z drugim tipom baze. Rad bi naredil tako, da bi pri "preklopu" med bazami spremenil samo globalno spremenljivko. HvalaMatjaž 

bojanv
bojanv - petek, 29. december 2006

Sicer ne razumem točno, kaj hočeš dosečti, ker lahko tudi z preverko (if) na podlagi tipa to uredis (if (inputValue is int) Razred1 a = new Razred1();). Mogoče sem narobe razumel. Elegantnejše lahko rešiš to z generiki. Daš generičen interface pa po njem določaš razrede glede na potrebe. Recimo:interface IMyInterface<T> .... potem pa public class Razred1<T> : IMyInterface<T> .... pa določaš sam tipe, metode, property-je pa itak morš met take, kot so predpisane. Lahko pa narediš abstrakten razred pa s type casti dobivaš razrede glede na tipe ali pa metode posebej določiš, kakšne morajo biti....recimo primer:abstract class Razred<T>    {        public abstract void Metoda(params T[] data);    }    class Razred1<T> : Razred<T>    {        public override void Metoda(params T[] data)        {            if (data is int[])                Console.WriteLine("Maš int.....");            else                Console.WriteLine("Ni int!");        }    }    class Razred2<T> : Razred1<T>    {        public void Metoda<U>(U data) where U : struct        {            Console.WriteLine();        }    }  Razred1<int> instanca = new Razred1<int>(); instanca.Metoda(1); Razred<string> instanca2 = new Razred1<string>(); instanca2.Metoda("1"); DateTime time = DateTime.Now; Razred2<int> instanca3 = new Razred2<int>(); //ker smo dali da mora bit tip U tipa struct instanca3.Metoda<DateTime>(time); Če se ne razumeva pa povej....

AndrejT
AndrejT - petek, 29. december 2006

A Razred r = new Razred1() in Razred r = new Razred2() ni v redu?