Yayy, laten we er een flame/discussietopic van maken.
Het is vooral een discussie over smaak, dus eruit komen of iemand overtuigen zal toch niet lukken, magoed, for what it's worth:
Qué? Nee klopt. Maar waarom zit dat inlinen er? Omdat je voor een getter (die vaak gewoon de waarde van een variabele teruggeeft) anders elke keer een functiecall nodig hebt. Dus begint iedereen uit het efficiency-kamp (en dat is bij C++ zo'n beetje iedereen

) meteen te schreeuwen: "Ja maar eej, dat gebruiken we niet, daar wordt de code veel te traag van!". En dus geven ze je de mogelijkheid om er inlines van te maken, zodat het nadeel dat de getters opgeroepen hebben weer onder het tapijt geveegd kan worden. Erg leuk ook overigens, dat je de code dan in de
declaratie van de klasse moet zetten. Implementation hiding, mehoela.
Syntactic sugar dus. Een property kan niets meer dan een getter/setter, het oogt wat leuker omdat je geen haakjes achter een property hoeft te gebruiken, maar daarmee is ook alles gezegd.
Niet helemaal. Omdat je een property voor het lezen of schrijven ook direct naar een geheugenadres kan laten verwijzen, heb je geen geinlinede getter nodig. Verder kun je op heel natuurlijke wijze de waarde van een "eigenschap" uitlezen danwel veranderen.
code:
1
2
| print willy.length
willy.length := willy.length * 2 |
versus
code:
1
2
| print willy.getLength()
willy.setLength(willy.getLength() * 2) |
Tuurlijk, het tweede is ook wel te schrijven/lezen, maar het eerste is makkelijker en oogt duidelijker.
Vlam vlam. Kom eens terug tegen de tijd dat C# en Delphi evenveel funtionaliteit in de taal biedt als C++ (templates, multiple inheritance).
Leuke
Red Herring, maar daar ging 't niet over, wel?
Ik wil er nog wel even op ingaan: ik vind het inderdaad jammer dat Delphi geen generics bezit; al dat typecasten bij het gebruik van een TList wordt op den duur nogal vervelend. En multiple inheritance... sja. Dat is weer een hele discussie op zich. Persoonlijk vind ik dat multiple inheritance wel moet kunnen, maar echt missen doe ik 't niet. En het is natuurlijk altijd te simuleren met interfaces.
Templates zijn een implementatie van generics, of beter gezegd
Generic Programming.
Janoz schreef op 28 juli 2004 @ 15:17:
[...]
Mwah, persoonlijk zie ik liever gelijk wat ik nu eigenlijk doe. Nu weet ik niet precies hoe properties geimplementeerd zijn, maar ik voorzie problemen bij het aanroepen van een getter binnen de eigen class.
Eigenlijk komt het er op neer dat exact hetzelfde stukje code verschillend kan werken afhankelijk van de plaats waar deze staat (Andere class, zelfde class, binnen de setter/getter zelf) en dat vind ik dan onduidelijk. Nee, geef mij maar code waaraan ik precies zie wat wordt aangeroepen

.
Ik ben bang dat ik niet begrijp wat je bedoelt. Als je het goed implementeert zorg je natuurlijk dat een stuk code maar één betekenis heeft. En dan nog liefst eentje die consistent is door je hele codebase.
Zoijar schreef op 28 juli 2004 @ 15:21:
[...]
Tsja, misschien is het persoonlijke voorkeur. Ik hou niet zo van dingen die automagically gebeuren. Met get/set worden beiden mogelijkheden apart geboden, de programmeur maakt de beslissing (of die nou goed is of slecht is een tweede) en niet de taal. Een taal moet een hulpmiddel zijn om een probleem uit te drukken. De taal moet dus niet allemaal dingen aan nemen en met een beetje magie voor elkaar krijgen.
Niets houdt je tegen om in Delphi of C#, of welke taal dan ook properties ondersteunt, gewoon nog steeds getter- en setterfuncties te maken hoor.
Ik weet niets van properties helaas, maar kunnen die side effects hebben? Zal haast wel, lastig om daar op te checken namelijk. Dan doet "obj.x = 1; obj.x = 1;" ineens iets anders dan "obj.x = 1;". Dat verwacht je niet, want je denk gewoon een geheugen var te zetten. Met de functie haakjes zie je in ieder geval dat er een functie wordt aangeroepen met mogelijke side effects. (ofwel "obj.x() = 1", of "obj.x(1);" wederom nog eens twee mogelijkheden om de dingen te doen)
Dat kán ja. Maar als je obj.setX(1); obj.setX(1); doet verwacht je ook niet dat er twee dingen gebeuren. Het punt is dat als je je (verborgen) setter goed implementeert, het stuk code doet wat je verwacht. De discussie is niet of het te misbruiken is, of dat er slechte code mee geschreven kan worden. Natuurlijk, maar dat kan zonder properties even goed. Properties zijn echter wel een manier om je code een stuk leesbaarder mee te maken.
Overigens heb ik hier al vaker (vruchteloos) over gediscussiëerd met sterf-harde C++ programmeurs, en ik verwacht dan ook niet jullie te overtuigen.
(Maar ik probeer 't toch

)