a: A
b: B
Tesztkód:
class A
{
private Action _action;
public A() { _action = new Action(Foo); }
public void DoSomething() { _action(); }
protected virtual void Foo() { Console.WriteLine("A"); }
}
class B: A
{
protected override void Foo() { Console.WriteLine("B"); }
}
void Main()
{
var a = new A();
var b = new B();
Console.Write("a: "); a.DoSomething();
Console.Write("b: "); b.DoSomething();
}
Na akkor lássuk élesben az IComamnd + DelegateCommand-dal...
- saxus blogja
- A hozzászóláshoz be kell jelentkezni
- 679 megtekintés
Hozzászólások
Ez nem tudom miért olyan meglepő, ha simán meghívnád a Foo-t akkor is az overridden futna B esetén. Igaz nem tudom a delegate-ekből milyen CLR kód fordul, java 8-ban elég egyértelmű:
class A {
public final Runnable f = this::execute;
public void execute() {
System.out.println("A");
}
}
class B extends A {
@Override
public void execute() {
System.out.println("B");
}
}
public class Main {
public static void main(String args[]) {
new A().f.run(); // A
new B().f.run(); // B
}
}
Az f sorából ez lesz:
public final Runnable f = new Runnable() {
@Override
public void run() {
execute();
}
};
Akartam adni linket futó kódra, de sajnos amit találtam java8 környezetet az nem igazán akar működni... :(
Szerk: amúgy most tűnt fel, hogy nálam simán futott ez úgy, hogy egy .java fileban volt ez a kód, pont ahogy ide bemásoltam. Google nélkül ki tudja, miért? :)
- A hozzászóláshoz be kell jelentkezni
Nem meglepő/nem meglepőség kérdése volt, hanem adódott egy szituáció, ahol ez megoldás lehetett, viszont nem voltam biztos a delegáltak működésében (csak végére kellene már érni egyszer a CLR via C#-nak...), így kipróbáltam.
A biztonytalanságom abból adódott, hogy ránézve a Delegates MSDN szócikkre (vagy akár a C# referenciára kb. annyinak tituálják a delegáltakat, mint "type safe function pointer". Viszont az is igaz, hogy a C++ fv pointereihez hasonlítják, ami utánanézve valóban figyelembe veszi azt, hogy virtuális-e (annyira azért nem ismerem a C++-t), de azért egyszerűbb lett volna az ilyet beleírni a doksiba, mint egy másik nyelvhez irányítani az embert...
A "problémám" gyökere amúgy valószínűleg abban leledzhetett, hogy eddig ezekre kb. úgy gondoltam, mint egy sima C-s fv. pointerre, ami nem igazán fog hasonlókat művelni.
(Ismételt) tapasztalat: ha valaki C#/Java-zni akar, felejtse el, amit C-ben tanult, mert csak fasságokra fogja vezetni az embert.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni
"We observe the various interpretations of overriding and overloading in object oriented languages. With the description of an intend, represented as the following UML diagram, we have "naively" implemented in 15 different languages the same piece of code... and obtenained 11 different results."
http://public.enst-bretagne.fr/~beugnard/papiers/lb-sem.shtml
- A hozzászóláshoz be kell jelentkezni
Ezt most pont arra, mikor ez a fentebb tárgyalt három OO nyelvben pont ugyanugy mukodik...?
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™
- A hozzászóláshoz be kell jelentkezni