Hallo,
im folgenden Code wird die Methode "void doIt(A a)" aufgerufen.
Warum nicht die Methode "void doIt(B b)"? Wie muss der Code
abgeändert werden, dass die Methode "void doIt(B b)" aufgerufen wird?
Die Methoden "void doIt(...)" sollen in der Klasse Program verbleiben
und NICHT in die Klassen A bzw. B verschoben werden.
Gruß
Horsti
using System;
namespace Ueberladen
{
class A
{
}
class B : A
{
}
class Program
{
static void Main(string[] args)
{
Program program = new Program();
A a = new B();
program.doIt(a);
Console.ReadKey();
// --> A
}
void doIt(A a)
{
Console.WriteLine("A");
}
void doIt(B b)
{
Console.WriteLine("B");
}
}
}
Hallo Horsti,
was du wahrscheinlich möchtest, ist statt
Programm program = new Program();
program.doIt(a);
den "this"-Operator zu verwenden:
this.doIt(a);
this.doIt(b);
Solange du auf die Methoden der Klasse "Program" zugreifen möchtest.
Siehe Namenskonflikte mit this lösen
naja der "this"-Operrator ist nicht das Problem, wenn ich es verstanden habe.
Horsti hat 2 gleiche Methoden. Nun wird ein Objekt initialisiert vom Typ der Basisklasse.
Erwünscht ist aber nun der Methodenaufruf mit dem Parameter der vererbten Klasse.
Ahh, stand aufm Schlauch ...
Du hälst zwar das Objekt in einer Variablen deines Basistyps, willst aber dann das Objekt in seinem eigentlichen Typ behandeln, richtig?
Naja, du betreibst ja eben Boxing.
Also musst du den Wert unboxen, also zurückcasten.
@Ezio: Der "this"-Operator löst das Problem nicht.
Soweit ich mich erinnern kann, würde in C++ die Methode "void doIt(B b)" aufgerufen...
Was auch interessant ist: Schon bei der statischen Codeanalyse wird die Methode
"void doIt(B b)" als nicht verwendet angezeigt...
Du musst a in B konvertieren:
if (a is B)
{
program.doIt((B)a);
}
else
{
program.doIt(a);
}
Leider zu spät 😃
Aber zurückcasten möchte ich eigentlich nicht.
Das ist sehr unschön.
Eigentlich sollte das doch die Polymorphy erledigen.
So wie in C++.
Dafür müsstest du doIt als virtual-Methode in A implementieren und diese dann in B überschreiben.
Eigentlich sollte das doch die Polymorphy erledigen.
So wie in C++.
Schon, wenn du richtig implementiert, siehe Polymorphismn in C#
**:::
Die Methoden "void doIt(...)" sollen in der Klasse Program verbleiben
und NICHT in die Klassen A bzw. B verschoben werden.
Die Klassen A bzw. B sind reine Datenklassen. Diese sollen keine Funktionalität enthalten.
Hallo Horsti,
wenn du unbedingt es nicht so machen möchtest, wie vbprogger es geschrieben hat, bleibt dir nur die Methode mit Boxing/Unboxing, also das was ich und hypersurf dir sagen wollten.
Das nennt sich dynamische Bindung: Dynamische Bindung
Gibts es in C# allerdings nicht. Die einzige Möglichkeit: Selber implementieren.
ImageTools for Silverlight: http://imagetools.codeplex.com | http://www.silverdiagram.net | http://www.cleancodedeveloper.de b:::
@malignate: Danke "dynamische Bindung" war der entscheidende Hinweis.
Dynamische Bindung wurde mit C# 4.0 eingeführt.
Jetzt geht es:
dynamic a = new B();
program.doIt(a);
Console.ReadKey();
// --> B
Das nennt sich dynamische Bindung:
>Gibts es in C# allerdings nicht. Die einzige Möglichkeit: Selber implementieren.
Ohne dynamisches Binden würde Polymorphie doch überhaupt nicht funktionieren oder vertue ich mich hier? Spätestens wenn du eine Methode in c# als virtual kennzeichnest wird sie mit in die Virtual function Table übernommen und so weiter.....
Ja, du hast Recht, das war der falsche Link und der falsche Begriff. Habe Multimethoden gesucht:
oder auch:
http://blogs.msdn.com/b/laurionb/archive/2009/08/13/multimethods-in-c-4-0-with-dynamic.aspx
ImageTools for Silverlight: http://imagetools.codeplex.com | http://www.silverdiagram.net | http://www.cleancodedeveloper.de b:::