Hej. Man måste använda override för att man i C# explicit måste tala om att man vet att man överlagrar en metod i en superklass. Om du kolla på Java så fungerar det ju inte så. Det har sina för, och nackdelar tycker jag själv. Fördelen är ju att du, som programmerare, vet när du överlagrar en metod... Hej. <code> det var ingen "överlagring" innan.Arv m.m.
Försöker mig på objektorientering igen. :-)
Anta att jag skapat ett interface, (Ia). (Insert skall returnera en egendefinierad klass)
<code>
public interface Ia
{
MyClass Insert();
}
</code>
Jag skapar sedan en klass (B) som implementerar Ia
<code>
public class B : Ia
{
public MyClass Insert()
{return new MyClass(1);}
}
</code>
Jag vill sedan ärva klassen B och överlagra "Insert()"
<code>
public class C : B
{
public MyClass Insert()
{return new MyClass(2);}
}
</code>
Detta fungerar men jag får en varning (vågad linje under "B.Insert()"):
"The keyword new is required on 'C.Insert(int)' because it hides inherited member 'B.Insert(int)'" eller liknande. Varför?
Nyckelordet override, vad har det (eller kan ha) för betydelse i detta fall?? Borde jag inte använda detta?
Nån som har lust att förklara? Sv: Arv m.m.
Kanske inte mycket till förklaring men iallafallSv: Arv m.m.
OK. Men hur skall jag få med nyckelordet "override" i detta exempel?
Får fel hur jag än gör...Sv: Arv m.m.
public class B : Ia
{
public virtual MyClass Insert()
{return new MyClass(1);}
}
</code>
"virtual" betyder att den metoden KAN overridas i subklasser
<code>
public class C : B
{
public override MyClass Insert()
{return new MyClass(2);}
}
</code>
//RogerSv: Arv m.m.
Hej igen.
Japp, nu fick jag bort varningen och allt blev tydligare... Tack!
Men nu är frågan... Varför fungerade det att "överlagra" innan... utan att använda nyckelordet "override"??Sv: Arv m.m.
du fick bara en ny metod som heter samma sak som metoden i interfacet och basklassen.
testa följande exempel:
<code>
using System;
namespace ConsoleApplication1
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
C var1=new C ();
var1.Insert (); //anropa Insert på var 1
B var2=new B ();
var2.Insert (); //anropa Insert på var 2
Ia var3=var2;
var3.Insert (); //anropa "Ia.Insert" på var2
var3=var1;
var3.Insert (); //anropa "Ia.Insert" på var1
//kolla vad det står i consolen efter denna
Console.ReadLine();
}
}
public class MyClass
{
public MyClass(int i)
{
}
}
public interface Ia
{
MyClass Insert();
}
public class B : Ia
{
public MyClass Insert()
{
Console.WriteLine ("im inside class b insert");
return new MyClass(1);
}
}
public class C : B
{
public MyClass Insert()
{
Console.WriteLine ("im inside class c insert");
return new MyClass(2);
}
}
}
</code>