Archief - C# 4.0: 2 identieke methods maar ander parametertype

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Destiser

Legacy Member
Hallo,

even schetsen: Ik heb een third-party dll waarin een constructor-loze klasse zit. Laten we deze klasse: 3rdClass noemen.

Ik heb een method DoSomething(3rdClass item) die properties van item gebruikt. Doordat 3rdClass constructorloos is vragen jullie je waarschijnlijk af, hoe kom je dan aan objecten van 3rdClass? Well daarvoor heb ik een 3rdClass2 met een method die me een verzameling teruggeeft van 3rdClass objecten.

Nu, in mijn programma is het nodig om toch zelf objecten van 3rdClass te maken, daarom heb ik mijn eigen klasse geschreven, MyClass, die exact dezelfde properties heeft als die van 3rdClass. Ik had eerst geprobeerd om MyClass te laten erven van 3rdClass, maar omdat 3rdClass geen constructor heeft kan ik dus ook geen constructor maken in MyClass.

3rdClass implementeert geen interfaces, dus kan ik ook geen interfaces implementeren in MyClass.

Hopelijk zijde nog mee :p nu heb ik natuurlijk een method DoSomething(MyClass item) die voor 100%, maar echt krak hetzelfde doet als DoSomething(3rdClass item).

Wat ik nu wil bereiken: Ik wil die methods combineren tot 1 method zodat ik eventuele aanpassingen niet altijd dubbel hoef uit te voeren. Maar hoe doe ik dit? Ik kan geen interface als parameter declareren want er is er geen. En mits ik niet aan de source van die 3rdClass kan, kan ik daar ook geen constructor of interface aan koppelen.

Wat ik zelf dacht is: Ik kan een DoSomething(object item) maken, en dan zal die method zowel 3rdClass als MyClass objecten accepteren, maar hoe raak ik dan aan hun properties? Een extra moeilijkheid is dat een bepaalde propertie van deze twee klasses objecten teruggeeft van het type van de klasse zelf, en die heb ik dan ook nodig:

even demonstreren:

Code:
public void DoSomething(3rdClass item)
{
label.text = item.Propertie1;
3rdClass child = item.FirstChild;
//More code, code above is bullshit but shows what I need
}
 
public void DoSomething(MyClass item)
{
label.text = item.Propertie1;
MyClass child = item.FirstChild;
//More code, code above is bullshit but shows what I need
}

De ultieme vraag: is er een manier om van die twee methods, die compleet verschillende parameters, maar met dezelfde properties, vragen in 1 method steken?

Hopelijk was ik duidelijk, 'k vind het zelf nogal ambetant om uit te leggen :) Merci!

Parnakra

Legacy Member
Uw methode een object als parameter meegeven en dan casten naar 3rdClass. Dan heb je normaal gezien die MyClass niet nodig.
Code:
public void DoSomething(object x) {
   3rdClass item = (3rdClass)x;
   label.text = item.Propertie1;
   3rdClass child = item.FirstChild;
   //More code, code above is bullshit but shows what I need
}

Moto

Legacy Member
Zou eens opzoeken naar DuckTyping, dan kunt ge uw eigen interface declareren en zeggen dat een 3rdClass object die implementeert, heb dat eens in C# 3.5 gebruikt via men orm, maar normaal is dat standaard in C# 4.0 via die nieuwe dynamic features

NeverwinterX

Legacy Member
Waarom zet je al die 3rdClass objecten niet om naar Myclass objecten en gebruik intern volledig die Myclass, dan heb je die DoSomething(3rdClass item) niet meer nodig?

De enige reden die ik kan bedenken is dat je die 3rdClass nodig hebt om terug te communiceren met die third party library, maar dat kan sowieso al niet met die Myclass objecten want die library kent die niet.

Destiser

Legacy Member
Parnakra zei:
Uw methode een object als parameter meegeven en dan casten naar 3rdClass. Dan heb je normaal gezien die MyClass niet nodig.
Code:
public void DoSomething(object x) {
   3rdClass item = (3rdClass)x;
   label.text = item.Propertie1;
   3rdClass child = item.FirstChild;
   //More code, code above is bullshit but shows what I need
}

Dus een MyClass item casten als 3rdClass zou moeten lukken? Omdat de properties dezelfde zijn? Maar 3rdClass heeft geen constructor en MyClass wel.

Moto zei:
Zou eens opzoeken naar DuckTyping, dan kunt ge uw eigen interface declareren en zeggen dat een 3rdClass object die implementeert, heb dat eens in C# 3.5 gebruikt via men orm, maar normaal is dat standaard in C# 4.0 via die nieuwe dynamic features

Klinkt interressant maar onderstaande is denk ik beter.

NeverwinterX zei:
Waarom zet je al die 3rdClass objecten niet om naar Myclass objecten en gebruik intern volledig die Myclass, dan heb je die DoSomething(3rdClass item) niet meer nodig?

De enige reden die ik kan bedenken is dat je die 3rdClass nodig hebt om terug te communiceren met die third party library, maar dat kan sowieso al niet met die Myclass objecten want die library kent die niet.

Potjandorie! Dat ik zelf niet aan zoiets gedacht heb! Direct proberen maar da moet lukken, bedankt. Alhoewel ik nu meteen aan en probleem denk dat ieder 3rdClass object een propertie heeft met een 3rdClass object en dat dat een hele geneste soep wordt om om te zetten.

Tyfius

Legacy Member
Het is nog vroeg, dus vergeef mij als ik iets dom zeg.

Vanwaar haal jij dat 3rdClass geen constructor heeft? Omdat er geen constructor gedocumenteerd is? Omdat het een static klasse is? Omdat het een abstract klasse is?

Welke error krijg je als je gewoonweg new 3rdClass() oproept?

Jerre Muesli

Legacy Member
Ben een absolute leek in C# maar als dit is zoals in Java of VB.Net dan krijgt elke klasse altijd een default constructor aangewezen door de compiler bij mijn weten.
Geen body, geen parameters. Dat deze private zou staan is nog iets helemaal anders.

Destiser

Legacy Member
Tyfius zei:
Het is nog vroeg, dus vergeef mij als ik iets dom zeg.

Vanwaar haal jij dat 3rdClass geen constructor heeft? Omdat er geen constructor gedocumenteerd is? Omdat het een static klasse is? Omdat het een abstract klasse is?

Welke error krijg je als je gewoonweg new 3rdClass() oproept?

Jerre Muesli zei:
Ben een absolute leek in C# maar als dit is zoals in Java of VB.Net dan krijgt elke klasse altijd een default constructor aangewezen door de compiler bij mijn weten.
Geen body, geen parameters. Dat deze private zou staan is nog iets helemaal anders.

Ik krijg de fout: 'This class has no constructor taking zero parameters' of zoiets eh :p Ik ben 100% zeker dat er geen constructor is hoor, anders had ik dat wel al gezien in de intellisense. Waarschijnlijk een protected ctor?

edit: Error 1 The type 'TwinCAT.Ads.TcAdsSymbolInfo' has no constructors defined

Jerre Muesli

Legacy Member
is die klasse geen singleton dat ge moet aanmaken met een method à la GetInstance() ?

Tyfius

Legacy Member
COM objectjes I presume?

Dan kunde zoiets inderdaad wel voorhebben. Het staat ook in hun documentatie dat het objecten zijn die aangemaakt worden door de TcAdsSymbolInfoLoader klasse.

Dan zul je inderdaad naar een bovengenoemde oplossing moeten gaan.

Destiser

Legacy Member
Parnakra zei:
Uw methode een object als parameter meegeven en dan casten naar 3rdClass. Dan heb je normaal gezien die MyClass niet nodig.
Code:
public void DoSomething(object x) {
   3rdClass item = (3rdClass)x;
   label.text = item.Propertie1;
   3rdClass child = item.FirstChild;
   //More code, code above is bullshit but shows what I need
}

dat lukt bij mij niet als x een MyClass is, het is voor mij noodzakelijk om MyClass objecten te maken.

NeverwinterX zei:
Waarom zet je al die 3rdClass objecten niet om naar Myclass objecten en gebruik intern volledig die Myclass, dan heb je die DoSomething(3rdClass item) niet meer nodig?

De enige reden die ik kan bedenken is dat je die 3rdClass nodig hebt om terug te communiceren met die third party library, maar dat kan sowieso al niet met die Myclass objecten want die library kent die niet.

Ik moet te diep recursief gaan bij sommige items (100.000 en ik geraak maaar tot 10.240) om ze te volledig te kunen omzetten
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan