webForumDet fria alternativet

disabla en Metod i base från en ärvd klass

.NET

11 svar · 732 visningar · startad av lucgo446

Medlem sedan aug. 2002221 inlägg
Frågan#1

:e

kan man disabla en Metod i base från en ärvd klass?

Exempel:

public class Person{

public Person(){}

public virtual Person GetKusin(){
return new Kusin();
}

}

//klass som ärver, men däri vill jag disabla GetKusin()

public class Kusin: Person{

public Kusin(){}

public override Person GetKusin(){
 // vill inte ha denna på Kusin
}

}

Alltså vill jag inte ha GetKusin på Kusin. Skulle vilja ändra "public" till private i Person-klass, typ...

Medlem sedan juni 20008 205 inlägg
#2

Nix, går inte. Du kan överskugga metoden och kasta exceptions eller nåt sånt, men det är inte kosher objektorientering.

Medlem sedan jan. 20012 204 inlägg
#3

Använd dig av ett interface som implementerar alla funktioner utan GetKusin och sen jobba mot det, kanske...

Medlem sedan apr. 2004778 inlägg
#4

Nu får väl någon rätta mig om jag har fel, men är det verkligen "kosher objektorientering" att låta Person klassen se Kusin, som ärver Person?
Metoden GetKusin() borde inte finnas i Person.
Person-klassen är föräldern och där ska det väl inte finnas några funktioner som "anropar" eller använder "barnen"?

Medlem sedan aug. 2002221 inlägg
#5

Stirra er inte blinda på innehållet utan på vad jag egentligen frågar...

Går det att disabla en metod som ärvs? ta bort den.

Medlem sedan juni 20008 205 inlägg
#6

Nej, det går inte. Rent objektorienteringsmässigt finns det ingen anledning att tillåta det, eftersom poängen med arv är att man vet att allt som finns i superklassen även finns i subklassen. Annars får man sjukt jobbiga exekveringsfel av kod i stil med den här:

public skrivKusin(Person p){
    print(p.getKusin());
}

...

Kusin k = new Kusin();
skrivKusin(k);
Medlem sedan aug. 2002221 inlägg
#7

jo, jag är med, man frångår då modellen för polymorfism. Men ändå... ;)

Medlem sedan apr. 2004778 inlägg
#8

Nu skjuter jag från höften men om du gör metoden private shadows GetKusin() i Kusin-klassen då, vad händer då?

Medlem sedan aug. 2002221 inlägg
#9

Var får du shadows ifrån? Finns inte i C#

Med private så blir den privat i Kusin men Person.GetKusin() finns kvar

Medlem sedan apr. 2004778 inlägg
#10

Sorry, shadows är VB, override borde det vara i C#
Men, jag hittade en länk åt dig där de gör precis vad du efterfrågar, http://weblogs.asp.net/despos/archive/2004/03/10/86995.aspx

Vad menar du med att Person.GetKusin() finns kvar?
Om du har en variabel av typen Person är det klart att den har GetPerson().

Medlem sedan aug. 2002221 inlägg
#11

Tack P, det var inte det... men det gör inge. Ville bara få bekräftat att det inte går...

Vad menar du med att Person.GetKusin() finns kvar?

Jo, Kusin.GetKusin() är privat medans Person.GetKusin() är ju fortfarande publik och "finns kvar"

Medlem sedan juni 20008 205 inlägg
#12

Alltså, det faktum att metoden "finns kvar" efter arv är inte en bieffekt, utan själva definitionen av arv. Allt som finns i typ A måste finnas i typ B för att B ska vara en subtyp av A. Att bara delvis ärva är inget arv, med andra ord :)

I dynamiska OO-språk (Python, Javascript etc) är det toklätt att ta bort metoder och liknande. Fast man gör det liksom ändå inte.

261 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)