Minulla on kantaluokka, joka sisältää jäsenmuuttujan. Jäsenmuuttujalle tehdään yhteisiä opraatioita kantaluokassa.
Kantaluokasta periytetään aliluokkia. Aliluokkien tarvitsee käyttää kantaluokan jäsenmuuttujaa omalla tavallaan.
Miten saan periytettyä kantaluokan jäsenmuuttujasta tämän aliluokan olion periytetyissä luokissa?
Esim.
class Base { protected Kanta var; handleVar () { var = ... } } class Inh : Base { var = new Ali(); var.JokinAliluokanOperaatio(): //TÄMÄ EI TOIMI!
using System; namespace MyTestNamespace { class MyClass : BaseClass { public bool MyOperation() { return MyInheritedOperation(); } } class BaseClass { public bool MyInheritedOperation() { return true; } } }
using System; namespace MyTestNamespace { class Program { static void Main(string[] args) { MyClass _MyClass = new MyClass(); bool ThroughBaseClass = _MyClass.MyOperation(); bool DirectlyFromInherited = _MyClass.MyInheritedOperation(); } } }
Tuo ei vastaa kysymykseen.
Siis miten luoda kantaluokassa olevasta A-tyyppisestä muuttujasta B-luokan olio lapsiluokassa?
Siis kantaluokassa protected A a. Lapsiluokassa pitääkin luoda a = new B();
A on B:n kantaluokka.
Lapsiluokassa halutaan käyttää a:n B-luokan ominaisuuksia. Kantaluokassa käytetään a:n A-luokan ominaisuuksia.
Siis tarkoitatko nyt jotain tällaista:
namespace ConsoleApplication2 { class A { public virtual void method() { Console.WriteLine("A:n metodi"); } } class B : A { public override void method() { Console.WriteLine("B:n metodi"); } } class Base { protected A a; public Base() { this.a = new A(); } public virtual void method() { this.a.method(); } } class Child : Base { public Child() { this.a = new B(); } public override void method() { this.a.method(); } } class Program { static void Main(string[] args) { Base baseObj = new Base(); baseObj.method(); Child childObj = new Child(); childObj.method(); } } }
Olettaen että kyse oli kantaluokan jäsenmuuttujan käpistelystä aliluokassa... (Eihän tuosta mitään selvää saa.)
*** X.h class X { public: X() { _member = new A(); } protected: A * getMember() { return _member; } void setMember(A * member) { _member = member; } private: A * _member; }; *** Y.h class Y : public X { public: Y(); void doSomething(); }; *** Y.cpp Y::Y() : X() { // hox: B:n täytyy periytyä A:sta B * newMember = new B(); setMember(newMember); } void Y::doSomething() { B * newMember = dynamic_cast<B*>(getMember()); ... }
Aihe on jo aika vanha, joten et voi enää vastata siihen.