"new", "override"
-
hallo, was ist der unterschied zwischen "new" und "override"? i meinem buch steh override nimmt man wenn man ein
polymorphes verhalten haben will, also dann zum überschreiben einer methode der basisklasse! aber wann nimmt man "new"?
cu
-
Kann es sein das die beiden nix miteinander zu tun haben?
new wird wohl dem C++ new entsprechen und override dem C++ virtual
-
Das Ergebnis ist eigentlich das selbe.
Allerdings muss eine Methode nicht virtual sein, wenn du new benutzt.
Eigentlich kann man sagen, new gibt's nur um Compiler Warnungen auszuschalten.
-
"new" benutzt man um eine Basisklassen-Methode oder Eigenschaft zu verdecken, während "override" nur für "virtual"-Methoden angewendet werden kann.
Als Beispiel:
ich hab ein UserControl, bei dem ich die Eigenschaft "Text" neu definiert habe (so daß von außen nicht mehr auf das ursprüngliche UserControl.Text zugegriffen werden kann), d.h. wie Abbes schon sagte, sobald der Compiler meckert einfach "new" hinzufügen oder aber den Namen der Methode/Eigenschaft ändern.
-
override sagt, dass die Methode, die du gerade schreibst die gleichnamige au der Basis-Klasse überschreibt.
new sagt, dass die Methode zwar den selben Namen hat, wie die aus der Basis-Klasse, diese aber dennoch nicht überschreibt.class Basis { public virtual void foo () { System.Console.WriteLine ("Basis.foo"); } public virtual void bar () { System.Console.WriteLine ("Basis.bar"); } } class Derivat : Basis { public override void foo () { System.Console.WriteLine ("Derivat.foo"); } public new void bar () { System.Console.WriteLine ("Derivat.bar"); } } ... Basis referenz = new Derivat(); referenz.foo(); // wurde überschrieben => "Derivat.foo" referenz.bar(); // wurde nicht überschrieben => "Basis.bar"
-
Helium schrieb:
override sagt, dass die Methode, die du gerade schreibst die gleichnamige au der Basis-Klasse überschreibt.
new sagt, dass die Methode zwar den selben Namen hat, wie die aus der Basis-Klasse, diese aber dennoch nicht überschreibt.class Basis { public virtual void foo () { System.Console.WriteLine ("Basis.foo"); } public virtual void bar () { System.Console.WriteLine ("Basis.bar"); } } class Derivat : Basis { public override void foo () { System.Console.WriteLine ("Derivat.foo"); } public new void bar () { System.Console.WriteLine ("Derivat.bar"); } } ... Basis referenz = new Derivat(); referenz.foo(); // wurde überschrieben => "Derivat.foo" referenz.bar(); // wurde nicht überschrieben => "Basis.bar"
Wobei man noch anmerken sollte, dass du auch hierbei die Moeglichkeit hast, die Basisfunktion aufzurufen:
class Derivat : Basis { public override void foo () { System.Console.WriteLine ("Derivat.foo"); base.foo(); } public new void bar () { System.Console.WriteLine ("Derivat.bar"); base.bar(); } } ...