[ calculon @ 18.06.2006. 14:17 ] @
Zanima me gde je greska, odnosno zasto sledeci deo koda u C#-u ne radi ono sto ocekujem:
Code:

using System;

public class A {

    public virtual void print() {
        Console.WriteLine("A.print()");
    }
}

public class B : A {

    public virtual new void print() {
        Console.WriteLine("B.print()");
    }
}

public class C : B {

    public override void print() {
        Console.WriteLine("C.print()");
    }
}

public class Test {

    public static void Main() {
        A a = new C();
        a.print();
        B b = new C();
        b.print();
    }
}

Ocekujem da se pri pozivu a.print() & b.print() pozove override-ovani print() metod iz C klase.
Medjutim, a.print() to ne radi.

Zasto gore navedeni kod nema istu funkcionalnost kao sledece u C++-u:
Code:

#include <iostream>

using namespace std;

class A {
    public:
        virtual void print() {
            cout << "A.print()" << endl;
        }
};

class B : A {
    public:
        virtual void print() {
            cout << "B.print()" << endl;
        }
};

class C : B {
    public:
        void print() {
            cout << "C.print()" << endl;
        }
};

int main() {
    A *a = (A*)new C();
    B *b = (B*)new C();
    a->print();
    b->print();

    return 0;
}

[ Wlada @ 18.06.2006. 14:32 ] @
Klasa B nije u redu. Trebalo bi da stoji override umesto virtual new.
Ovo piĊĦem napamet, ali mislim da je tako.
[ calculon @ 18.06.2006. 15:55 ] @
Verovatno sam se pogresno izrazio kada sam rekao "u cemu je greska", odnosno znam da ce override umesto virtual new dovesti do zeljenog ponasanja.

Ono sto me interesuje je zasto override metod (u klasi C) zamenjuje/"nadjacava" samo virtualni metod u direktno nadredjenoj (super) klasi (B), a ne i u super-super klasi (A)? (kao sto radi "print" metod u C++ klasi C)

EDIT:
Ok, igrao sam se malo i dosao do zakljucka da virtual new (u C# klasi B) i virtual (u C++ klasi B) nisu isto (doh :-0 ).

Zahvaljujem se svim citaocima, thread closed :-)


[Ovu poruku je menjao calculon dana 18.06.2006. u 17:12 GMT+1]