[ Valerij Zajcev @ 06.01.2010. 08:51 ] @
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?
[ Igor Gajic @ 06.01.2010. 09:08 ] @
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");
        }
}
[ Valerij Zajcev @ 06.01.2010. 09:22 ] @
Code:
 public new void move() 

Kada se stavi 'new' onda je gornja metoda skrivena pa tako i moze al dal je to ok postupak...
[ Valerij Zajcev @ 06.01.2010. 09:28 ] @
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");
        }
    }
[ mmix @ 06.01.2010. 09:32 ] @
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.
[ Igor Gajic @ 06.01.2010. 09:33 ] @
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();
[ mmix @ 06.01.2010. 10:16 ] @
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.
[ Valerij Zajcev @ 06.01.2010. 12:07 ] @
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?
[ mmix @ 06.01.2010. 12:21 ] @
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