Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Interface + Nasledjivanje

[es] :: .NET :: Interface + Nasledjivanje

[ Pregleda: 1873 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.hermes-softlab.com.



+2 Profil

icon Interface + Nasledjivanje06.01.2010. u 08:51 - pre 174 meseci
IMovable
Code:

public interface
{
       void move();
}

Bishop
Code:

public class Bishop : IMovable
{
       public void move()
       {
                // lala
       }
}

FlyingBishop
Code:

public class FlyingBishop : Bishop
{
        public void move()
        {
             // to do
        }
}


Problem: kada pozovem FlyingBishop.Move() pozove mi se metod iz Bishop klase. Ako hocu da FlyingBishop ima svoju Move() implementaciju da li njemu moram isto da dodam (... : IMovable) bez obzira sto mu parent ima taj interface? Ili se to nekako drugacije radi?
 
Odgovor na temu

Igor Gajic

Član broj: 93194
Poruke: 747
*.static.sbb.rs.



+987 Profil

icon Re: Interface + Nasledjivanje06.01.2010. u 09:08 - pre 174 meseci
Code:


public interface IMovable
{
       void move();
}

    
public class Bishop : IMovable
{
       public void move()
       {
           Console.WriteLine("From bishop");
       }
}
    
public class FlyingBishop : Bishop
{
        public new void move()
        {
             // to do

            Console.WriteLine("From flying bishop");
        }
}

    class Program
    {
        static void Main(string[] args)
        {
            FlyingBishop fb = new FlyingBishop();

            fb.move();

            Console.ReadKey();
        }
    }



Ovo radi normalno, tj ispise "From flying bishop". Kako ti istanciras Flying bishop pa ne dobijas korektne podatke ?


EDIT:

Ako imas ovako nesto:
Code:

            Bishop[] bishops = new Bishop[2];

            bishops[0] = new Bishop();
            bishops[1] = new FlyingBishop();


            bishops[0].move();
            bishops[1].move();


Onda ispisuje 2x From bishop

I onda trebas da metodu move definises ovako:


Code:

public class Bishop : IMovable
{
       public virtual void move()
       {
           Console.WriteLine("From bishop");
       }
}
    
public class FlyingBishop : Bishop
{
        public override void move()
        {
            Console.WriteLine("From flying bishop");
        }
}
 
Odgovor na temu

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.hermes-softlab.com.



+2 Profil

icon Re: Interface + Nasledjivanje06.01.2010. u 09:22 - pre 174 meseci
Code:
 public new void move() 

Kada se stavi 'new' onda je gornja metoda skrivena pa tako i moze al dal je to ok postupak...
 
Odgovor na temu

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.hermes-softlab.com.



+2 Profil

icon Re: Interface + Nasledjivanje06.01.2010. u 09:28 - pre 174 meseci
Evo ga opet problem i sa new, ulazi u klasu Covek:
Code:

static void Main(string[] args)
        {
            Covek c = new Covek();
            Student s = new Student();

            c.Move();
            s.Move();
            Console.WriteLine("-------------------------------------");
            WalkMethod(c);
            WalkMethod(s);
        }

        static void WalkMethod(object o)
        {
            if (o is IMovable)
            {
                (o as IMovable).Move();
            }
        }

Output
Code:

Covek hoda
Student hoda
--------------------------------
Covek hoda
Covek hoda
Press any key to continue . . .

Code:

public class Covek : IMovable
    {
        public string FirstName;
        public string LastName;

       

        public void Move()
        {
            Console.WriteLine("Covek hoda");
        }

       
    }

Code:

public class Student : Covek
    {
        public new void Move()
        {
            Console.WriteLine("Student hoda");
        }
    }
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Interface + Nasledjivanje06.01.2010. u 09:32 - pre 174 meseci
new sakriva implementaciju. Dovoljno je samo da iskoristis polimorfizam klasa kad ih vec nasledjujes. Dakle:

Code:

    public interface IMovable
    {
        void move();
    }
    public class Bishop : IMovable
    {
        public virtual void move()
        {
            Console.WriteLine("Bishop move");
        }
    }
    public class FlyingBishop : Bishop
    {
        public override void move()
        {
            Console.WriteLine("Flying Bishop move");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            IMovable b = new FlyingBishop();
            b.move();                  // <-- ovo ce ispisati flying bishop

            Console.ReadLine();
        }
    }


bez virtual/override CLR u call tabelu IMoveable instance smesta Bishop.Move bez obzira na to koja je nasledjena klasa instancirana.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Igor Gajic

Član broj: 93194
Poruke: 747
*.static.sbb.rs.



+987 Profil

icon Re: Interface + Nasledjivanje06.01.2010. u 09:33 - pre 174 meseci
Zavisi sta hoces da uradis, oba nacina su validna. Ali ako hoces da koristis klase kao sto sam naveo u 2. primeru moraces da koristis polimorfizam, znaci virtual + override...

A koriscenje kljucne reci new u definiciji f-je samo sakriva implementaciju f-je iz bazne klase, mada i dalje mozes koristiti i baznu implementaciju. Npr:

Code:

            FlyingBishop fb = new FlyingBishop();
            fb.move();
            ((Bishop)fb).move();
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Interface + Nasledjivanje06.01.2010. u 10:16 - pre 174 meseci
Ne, nece pozvati sa new. Pazi, on ne koristi objektne instance, koristi instancu interfejsa IMoveable cije tabele se generisu u odnosu na tacku u kojoj su implementirani. Jedini nacin da ovo proradi sa new je da FlyingBishop sam za sebe implementira IMoveable:

Code:

    public class FlyingBishop : Bishop, IMovable
    {
        public new void move()
        {
            Console.WriteLine("Flying Bishop move");
        }
    }


medjutim ovo potpuno ubija polimorfizam, ne samo nasledni nego i preko interfejsa, ako vec ovo moras da radis onda nemoj ni nasledjivati Bishopa i kreiraj FlyingBishop kao klasu za sebe.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.hermes-softlab.com.



+2 Profil

icon Re: Interface + Nasledjivanje06.01.2010. u 12:07 - pre 174 meseci
Citat:

Ne, nece pozvati sa new. Pazi, on ne koristi objektne instance, koristi instancu interfejsa IMoveable cije tabele se generisu u odnosu na tacku u kojoj su implementirani. Jedini nacin da ovo proradi sa new je da FlyingBishop sam za sebe implementira IMoveable:

Code:

public class FlyingBishop : Bishop, IMovable
{
public new void move()
{
Console.WriteLine("Flying Bishop move");
}
}


medjutim ovo potpuno ubija polimorfizam, ne samo nasledni nego i preko interfejsa, ako vec ovo moras da radis onda nemoj ni nasledjivati Bishopa i kreiraj FlyingBishop kao klasu za sebe.

Buni me to sto kada sam nasledio Bishop znam da sam dobio i njegovu move() metodu ali ja hocu da mi se FlyingBishop drugacije ponasa. Zato sam se i pitao da li je ok da kada vec nasledjuje move() kroz Bishop interface opet implementiram interface u njega.

mmix zasto si ovde gore implementirao IMovable pa koristio new?

Ja sam na kraju uradio ono sa virtuelnim metodama jel to ok?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Interface + Nasledjivanje06.01.2010. u 12:21 - pre 174 meseci
Ono sa IMovable+new je samo bio primer kako bi primer mogao da proradi sa new opcijom, nije preporuka da se tako uradi.

Interfejsi ti nisu potrebni da bi koristio polimorfizam, bar u ovom tvom primeru, zapravo takav polimorfizam ima neke lose osobine od kojih si ti upravo naleteo na jednu, ko je svojevremeno radio COM programiranje seca se interface hell-a. Interfejsi se koriste kad hoces da se dva objekta koji inace nisu u naslednoj relaciji "vide" preko istog ugovora. Primer bi bio recimo da imas klasu baba i klasu Zaba a treba ti u skupu baba i zaba saznas kolika je tezina istih. Onda napravis interfejs ITezina implementiras i u babama i u zabama i mozes da posmatras i babe i zabe kroz taj interfejs. Ako su objekti u naslednoj vezi iskoristi nasledni polimorfizam kad ga vec imas


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: Interface + Nasledjivanje

[ Pregleda: 1873 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.