Umiddelbart vil jeg jo mene at en superklasse IKKE må vide noget om hvad der er defineret af egenskaber eller metoder på en subklasse. Derfor skal superklassen benytte sig af det interface som den selv (eller dens egen superklasse) definerer - ellers hører den funktionalitet, efter min mening, ikke til på den aktuelle klasse...
Mht. det du efterspørger, så vil jeg mene det kan klares med en virtual metode. Noget i stil med dette:
"Dette skulle gerne gøre, at jeg får en kopi af mit B objekt, og i setData, skulle jeg gerne have adgang til attributterne i B objektet" >> Hvad er det egentlig helt præcis du vil opnå?
En superclass må sgu ikke kende til dens subclasses....
Kan du ikke prøve at beskrive lidt mere i fritekst hvad det er du vil opnå, og så er der sikkert nogen herinde der kan anbefale dig en måde at gøre det på, der ikke får binder unødige knuder på OOP.
Tror ikke rigtig i har forstået mit spørgsmål helt korrekt.
Har fået fortalt at BaseClass ikke må kende til SubClass.
Det jeg ønsker er, at tilgå attributter på et objekt, men jeg ikke ikke typen på objekt.
void testafobjekt( object e) { //Whatever needs to happen }
testafobjekt skal kunne kaldes ved at give en kopi af et objekt.
A objA; B objB;
objA og ojbB har hver sin setData verison, og inde i deres version kalder de så testafobject. Det vil sige at objA vil sende en kopi af et objekt fra class A og objB vil sende en kopi af et objekt fra class B.
public class WorkerClass { public void DoStuff(ILogic logic) { logic.DoLogic(); } }
public class A : ILogic { public void SetData() { WorkerClass worker = new WorkerClass(); worker.DoStuff(this); }
public void DoLogic() { } }
public class B : ILogic { public void SetData() { WorkerClass worker = new WorkerClass(); worker.DoStuff(this); }
public void DoLogic() { } }
public interface ILogic { void DoLogic(); }
Men jeg ville nu løse det sådan her i stedet: public class Tester { public void Run() { WorkerClass worker = new WorkerClass(); A a = new A(); worker.DoStuff(a); } }
public class WorkerClass { public void DoStuff(ILogic logic) { logic.DoLogic(); } }
public class A : ILogic { public void DoLogic() { } }
public class B : ILogic { public void DoLogic() { } }
Næsten, eftersom A er en subclass af ILogic, vil den kunne tilgå DoLogic( parameter ), hvor parameter er en template (i c++) for et ukendt klasse objekt.
Altså
//SuperClass public class ILogic { void DoLogic( parameter e, int type ) { switch( type ) { case 0: { // Hvis objekt af type A gør hvad der // skal gøres break; }
case 1: { // Hvis objekt af type B gør hvad der // skal gøres break; }
}
}
}
//SubClass public class A : ILogic { public void SetData() { DoLogic( this ); } }
//SubClass public class B : ILogic { public void SetData() { DoLogic( this ); } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.