Avatar billede teutebod Nybegynder
11. februar 2005 - 14:54 Der er 8 kommentarer og
1 løsning

Abstract base class

Hvad er forskellen på at vælge at bruge "virtual/override" eller at i sin abstracte klasse implementere metode en som "public bool Load(int ID) {...}". Og så i implementation af denne metode i klassen der arver fra denne abstrakte klasse, så deklarer "new public bool Load(int ID) {.....}"?

Synes ikke selv jeg kan se nogen forskel på resultatet.

Udover dette, findes der en måde at "skjule" et member fra sin base klasse? Jeg har nogle properties jeg ikke synes skal være synlige fra folk der bruge min klasse som implementere en abstract klasse.
Avatar billede arne_v Ekspert
11. februar 2005 - 15:03 #1
Der er skam stor forskel.

Se dette eksempel:

using System;

public class P1
{
    public virtual void M()
    {
        Console.WriteLine("P1 M");
    }
    public void MM()
    {
        M();
    }
}

public class C1 : P1
{
    public override void M()
    {
        Console.WriteLine("C1 M");
    }
}

public class P2
{
    public void M()
    {
        Console.WriteLine("P2 M");
    }
    public void MM()
    {
        M();
    }
}

public class C2 : P2
{
    public new void M()
    {
        Console.WriteLine("C2 M");
    }
}

class MainClass
{
    public static void Main(string[] args)
    {
        C1 c1 = new C1();
        c1.M();
        c1.MM();
        C2 c2 = new C2();
        c2.M();
        c2.MM();
    }
}
Avatar billede arne_v Ekspert
11. februar 2005 - 15:03 #2
Som outputter:

C1 M
C1 M
C2 M
P2 M
Avatar billede arne_v Ekspert
11. februar 2005 - 15:06 #3
virtual + override bruges når child skal erstatte noget parent funktionalitet

ingenting + new bruges når child skal bruge en metode med samme navn
som en metode i parent (men som kun erstatter parent metoden i denne klasse og
underklasser ikke i parentklassen selv)
Avatar billede segato Nybegynder
11. februar 2005 - 15:09 #4
Ellere kortere sagt. En virtuel funktion kan underklassen vælge at overskrive. En abstract funktion SKAL underklasse implementere. Så en abstract funktion giver en skarpere kontrakt.
Avatar billede teutebod Nybegynder
11. februar 2005 - 15:33 #5
Godt eksempel Arne, var svært at se nogen forskel i mine egne forsøg. Har jeg ret i at der ikke er nogen måde at skjule et member af base klassen?
Jeg kunne godt tænke mig at gøre det member private eller noget i den stil, så andre der bruger min child klasse ikke kan se den. Men det bekæmper vel ideen med at arve..

Læg også et svar får points.
Avatar billede arne_v Ekspert
11. februar 2005 - 15:42 #6
Det mener jeg ikke.

Det ville give store problemer.

P p = new C();
p.M();

hvis C har skjult M ??
Avatar billede arne_v Ekspert
11. februar 2005 - 15:42 #7
svar
Avatar billede segato Nybegynder
11. februar 2005 - 18:27 #8
Du kan godt hide members. Det er det man kalder hidding og shadowing members. her er et eksempel i VB mener det hedder hidding i c#

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbls7/html/vblrfVBSpec4_2_3.asp
Avatar billede arne_v Ekspert
11. februar 2005 - 19:14 #9
VB.NET Shadows = C# new

det er det vi snakker om her

men det virker ikke helt som man måske umiddelbart skulle tro

using System;

public class P
{
    public void M()
    {
        Console.WriteLine("P M");
    }
}

public class C : P
{
    private new void M()
    {
        Console.WriteLine("C M");
    }
}

class MainClass
{
    public static void Main(string[] args)
    {
        C c = new C();
        c.M();
    }
}

udskriver bare

P M

Man kan selvfølgelig lave en public new, men så får man jo forskel på:

C x = new C();

og

P x = new C();

og det er noget rod.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester