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)
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 - 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 - 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 - 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 - 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 - 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 - petek, 29. december 2006
A Razred r = new Razred1() in Razred r = new Razred2() ni v redu?