Inheritance

Status
Niet open voor verdere reacties.

bn2vs

Terugkerende gebruiker
Lid geworden
18 aug 2007
Berichten
1.705
Hey,

Ik heb een zooi classes en usercontrols in vb.net (en c#.net) die een hele zooi dezelfde velden, events, properties en methods hebben. Ik zoek naar een manier om die code centraal te krijgen, op een manier dat die enkel in die classes beschikbaar is. Inheritance (zoals ik het gewoon ben), is niet practisch, aangezien de meeste van mn classes en usercontrols al iets inheriten.

Ik neem aan dat er een manier is om mn code centraal te krijgen, maar heb geen idee hoe. Iemand een suggestie?

Alvast bedankt :)
 
Je kunt een class maken met shared functies.

Je geeft dan aan een functie de control als reference mee. De functie kan dan de juiste
bewerking doen op de control.

BV Elke control moet de kleur rood krijgen.

Public shared Sub SetControlRed(byval c as Control)
c.Color = Red
End Sub

Te makkelijk eigenlijk, maar het gaat om het idee.
 
Ja, dat kan ik doen met methods enzo, maar niet met events en properties, zeker niet als ze private zijn :(
 
Klopt,

Maar misschien is het mogelijk om een shared functie te maken die een event afvuurt ?
 
Ja, dat gaat, maar ik heb liever een oplossing die niet zo een omweg maakt. Die fields, events en properties moeten echt deel zijn van de class, zoals bij inheritance
 
Ja, dat gaat, maar ik heb liever een oplossing die niet zo een omweg maakt. Die fields, events en properties moeten echt deel zijn van de class, zoals bij inheritance

Private inheritance of anders composition ?
 
Private inheritance > bedoel je daar mee dat ik een private class inherit? Zoja, maakt geen verschil voorzover ik kan zien.

composition > als ik het goed begrijp is dat gewoon de class als object gebruiken in je class waar je die code nodig hebt? Zoja, dan kan je er idd wel aan, maar moet je steeds de naam van dat object liggen typen. Een redelijke oplossing, maar nog steeds niet ideaal :(
 
Hey,

Ik hoopte dat dat me zou kunnen helpen ja. Ik heb het al wat zitten proberen maar het enige dat ik daarmee kan centraizeren zijn de method namen enzo, niet hun code inhoud.

Ik heb er nog nooit echt mee gewerkt, dus een voorbeeld van hoe je ze kan toepassen op mijn probleem zou heel handig zijn :)

Alvast bedankt :D
 
Een andere manier om uit te leggen is dat ik die code gewoon wil 'includen', zoals je bij php kan doen, dat zou exact hetzelfde effect hebben.

Ik heb wat research gedaan, en als ik het goed begrijp kan je in visual C++ .Net meerdere classes inheriten, wat mijn probleem zou oplossen, EN 'includen', zoals je bij php kan doen.

Als er geen degelijke oplossing is in vb.net of c#.net zie ik het eventueel wel zitten om naar c++.net over te schakelen, maar dat is vanzelfsprekend een last resort...

Een oplossing of raad over of ik al dan niet zou moeten overstappen naar c++ is heel welkom :D
 
Multiple inheritance is in C# en VB.NET niet meer beschikbaar.
Dit zal vast een goede reden hebben (weet niet meer welke). Om dit te realiseren
zul je gebruik moeten maken van interfaces.

Een class kan van verschillende interfaces 'inheriten'.
 
Een class kan van verschillende interfaces 'inheriten'.


Kan heel goed zij dat dat zo is, maar ik vind enkel voorbeelden waar de method namen van een interface worden 'geinherit', niet de code. Zou je een klein voorbeeld kunnen geven van hoe je de code inherit?

Alvast bedankt :)
 
Een interface is een klasdefinitie en kent dus geen broncode. (vgl met een C header file zonder inline mogelijkheden). Een klasse kan van 1 superklasse overerven maar kan wel eerdere interfaces hebben.
Multiple inherticance is een concept dat voor discussie vatbaar is. De meeste nieuwere talen ondersteunen dit niet vanwege het Diamond problem. Visual C++ ondersteunt dit wel nog daar GNU c++ wel multiple inheritance ondersteund. Maar en de grote maar is dat c++ een ander inheritance systeem heeft dan .net waarbij je geen klasse kopie krijgt maar waarbij een duidelijk onderscheid bestaat tussen de baseklasse(n) en de overervingsklassen.

Overigens is wat jij voor elkaar wil krijgen alles behalve netjes om maar niet te zetten dat het gewoon verkeerd is. Wat maakt het dat al je klassen en usercontrols dezelfde functionaliteiten vertonen? Lees de principes van encapsulation in OOP eens door.
 
Als je het zo bekijkt is mijn oplossing idd verkeerd. Maar hoe los ik het dan wel op zonder gewoon met duplicaten van dezelfde code te werken? :confused:
 
Het is niet omdat je duplicaten hebt dat het daarom slechte code is. Als veel van je klassen dezelfde functionaliteiten vertonen gaat dit zelfs bevorderlijk werken mocht je ze ooit nog eens nodig hebben. Zo hebben bijna alle klassen in .net de functie .toString() en hebben bijvoorbeeld alle container klassen de functie length. Deze functies doen vak hetzelfde maar dan voor verschillende klassen en hebben vaak identieke implementatie.

Wat je eventueel kan doen is een reeks baseklassen of interfaces maken voor usercontrols, forms, containers,voor gewone klassen,... In deze baseklassen implementeer je dan het maximale zodat je derived klassen gebruik kunnen maken van deze functies, eigenschappen, members en events. Kijk misschien ook eens richting 'protected'.

succes
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan