Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: Kantaluokan jäsenmuuttujasta toisen tyyppinen olio

Tepi_78 [22.08.2012 10:34:32]

#

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!

groovyb [22.08.2012 11:36:16]

#

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();
        }
    }
}

Tepi_78 [22.08.2012 12:08:29]

#

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.

Triton [22.08.2012 15:13:53]

#

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();
         }
    }



}

The Alchemist [22.08.2012 16:33:07]

#

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());

    ...
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta