<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Skummelt med virtuelle metoder</title>
	<atom:link href="http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/</link>
	<description>om livet som .net utvikler</description>
	<lastBuildDate>Wed, 16 May 2012 21:05:45 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<item>
		<title>By: Mark Nijhof</title>
		<link>http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74483</link>
		<dc:creator>Mark Nijhof</dc:creator>
		<pubDate>Wed, 02 Dec 2009 10:40:57 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74483</guid>
		<description>I guess perhaps one reason for the methods in FNH to be virtual is because they use Castle DynamicProxy. WIll think a bit if I can dind an other valid reason :)</description>
		<content:encoded><![CDATA[<p>I guess perhaps one reason for the methods in FNH to be virtual is because they use Castle DynamicProxy. WIll think a bit if I can dind an other valid reason :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74482</link>
		<dc:creator>Torbjørn</dc:creator>
		<pubDate>Wed, 02 Dec 2009 10:15:51 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74482</guid>
		<description>Mark, I haven&#039;t used Flient NHibernate, so I don&#039;t know the particulars you are talking about. This post is based on advise from C# guru Bill Wagner, and this is some of what he is saying:

&quot;Calling virtual functions in constructors works only under the strictest of conditions. The derived class must initialize all instance variables properly in variable initializers. That rules out quite a few objects: Most constructors take some parameters that are used to set the internal state properly. So you could say that calling a virtual function in a constructor mandates that all derived classes define a default constructor, and no other constructor&quot;

If anyone have a real use case for calling virtual methods in a constructor, I would like to see it - and then help you refactor it ;)</description>
		<content:encoded><![CDATA[<p>Mark, I haven&#8217;t used Flient NHibernate, so I don&#8217;t know the particulars you are talking about. This post is based on advise from C# guru Bill Wagner, and this is some of what he is saying:</p>
<p>&#8220;Calling virtual functions in constructors works only under the strictest of conditions. The derived class must initialize all instance variables properly in variable initializers. That rules out quite a few objects: Most constructors take some parameters that are used to set the internal state properly. So you could say that calling a virtual function in a constructor mandates that all derived classes define a default constructor, and no other constructor&#8221;</p>
<p>If anyone have a real use case for calling virtual methods in a constructor, I would like to see it &#8211; and then help you refactor it ;)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Mark Nijhof</title>
		<link>http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74481</link>
		<dc:creator>Mark Nijhof</dc:creator>
		<pubDate>Wed, 02 Dec 2009 09:54:46 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74481</guid>
		<description>Hmm weird, I remember to call virtual methods on my base class for f.ex. Fluent NHibernate MapClass stuff, R# tells you that you shouldn&#039;t but you can and it will compile just fine. One way of cheating is to create a private method that calls the virtual method and call that from the Ctor.

But perhaps I missed something in the translation :)</description>
		<content:encoded><![CDATA[<p>Hmm weird, I remember to call virtual methods on my base class for f.ex. Fluent NHibernate MapClass stuff, R# tells you that you shouldn&#8217;t but you can and it will compile just fine. One way of cheating is to create a private method that calls the virtual method and call that from the Ctor.</p>
<p>But perhaps I missed something in the translation :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Rune Grimstad</title>
		<link>http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74480</link>
		<dc:creator>Rune Grimstad</dc:creator>
		<pubDate>Wed, 02 Dec 2009 09:26:54 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74480</guid>
		<description>Som sagt, eksempelet er ikke veldig bra, men read-only properties for statiske data fungerer fint det. Det er kjappere enn å ha en privat variabel som du skriver til. Bruddet er i propertyen. Denne vil kompileres til en metode som heter get_WorkPosition() og denne vil også være virtual. Så ved å bruke denne fra konstruktøren vil du få trøbbel. Søkt kanskje, men det er en mulig situasjon. hehe.

Jeg er helt enig angående det å ha kontroll - det er veldig lett å tro at man har oversikten for så å miste den. Så jeg synes ikke man skal unngå dette for en hver pris, men er helt enig i at man skal være forsiktig. Veldig forsiktig!</description>
		<content:encoded><![CDATA[<p>Som sagt, eksempelet er ikke veldig bra, men read-only properties for statiske data fungerer fint det. Det er kjappere enn å ha en privat variabel som du skriver til. Bruddet er i propertyen. Denne vil kompileres til en metode som heter get_WorkPosition() og denne vil også være virtual. Så ved å bruke denne fra konstruktøren vil du få trøbbel. Søkt kanskje, men det er en mulig situasjon. hehe.</p>
<p>Jeg er helt enig angående det å ha kontroll &#8211; det er veldig lett å tro at man har oversikten for så å miste den. Så jeg synes ikke man skal unngå dette for en hver pris, men er helt enig i at man skal være forsiktig. Veldig forsiktig!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Anders Knutsen</title>
		<link>http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74479</link>
		<dc:creator>Anders Knutsen</dc:creator>
		<pubDate>Wed, 02 Dec 2009 09:07:43 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74479</guid>
		<description>Rune Grimstad: Å ha virtuelle metoder er bare risikabel praksis i de tilfellene hvor man bruker en metode/property i konstruktøren til baseklassen. Hvis man ikke gjør dette vil ikke resharper reagere, da det tross alt bare er en ordinær override.</description>
		<content:encoded><![CDATA[<p>Rune Grimstad: Å ha virtuelle metoder er bare risikabel praksis i de tilfellene hvor man bruker en metode/property i konstruktøren til baseklassen. Hvis man ikke gjør dette vil ikke resharper reagere, da det tross alt bare er en ordinær override.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Torbjørn</title>
		<link>http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74478</link>
		<dc:creator>Torbjørn</dc:creator>
		<pubDate>Wed, 02 Dec 2009 09:04:10 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74478</guid>
		<description>Jeg bruker CodeRush selv, og har ikke sett at den gir noen advarsel på dette, så her er ReSHarper hakket bedre ser det ut til.

Utfordringer i det du sier ligger i at man gjerne *mener* at man har kontroll, men at det i praksis er urealistisk. Hva vet du om hvordan programvaren du skriver i dag ser ut om to år? Hva vet du om dem som kommer til å bruke klassene dine, og ikke minst, hva vet de om deg og dine antagelser? &quot;Kontroll&quot; er noe man har på prosjekter med én utvikler og varihet én uke eller mindre. Etter helgen er det lett å gjøre feil når objektene ikke oppfører seg som man intuitivt forventer. 

Eksempelet ditt gir forøvrig ikke helt mening for meg. Hvor er bruddet på denne regelen? Og overstyrer du virkelig implementasjonen av en property for å endre data? :)</description>
		<content:encoded><![CDATA[<p>Jeg bruker CodeRush selv, og har ikke sett at den gir noen advarsel på dette, så her er ReSHarper hakket bedre ser det ut til.</p>
<p>Utfordringer i det du sier ligger i at man gjerne *mener* at man har kontroll, men at det i praksis er urealistisk. Hva vet du om hvordan programvaren du skriver i dag ser ut om to år? Hva vet du om dem som kommer til å bruke klassene dine, og ikke minst, hva vet de om deg og dine antagelser? &#8220;Kontroll&#8221; er noe man har på prosjekter med én utvikler og varihet én uke eller mindre. Etter helgen er det lett å gjøre feil når objektene ikke oppfører seg som man intuitivt forventer. </p>
<p>Eksempelet ditt gir forøvrig ikke helt mening for meg. Hvor er bruddet på denne regelen? Og overstyrer du virkelig implementasjonen av en property for å endre data? :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Rune Grimstad</title>
		<link>http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74476</link>
		<dc:creator>Rune Grimstad</dc:creator>
		<pubDate>Wed, 02 Dec 2009 08:35:38 +0000</pubDate>
		<guid isPermaLink="false">http://blog.kjempekjekt.com/2009/12/02/skummelt-med-virtuelle-metoder/#comment-74476</guid>
		<description>ReSharper advarer også mot dette.
Det er absolutt en risikabel praksis, men har du kontrollen så synes jeg ikke det er noe problem å gjøre det. Noen ganger kan det tenkes at baseklassen gir en default-verdi, men at du ønsker å override denne i en subklasse. 
For å ta et dumt eksempel: Si at du har en Employee-klasse med en read-only property som gir WorkPosition: public virtual string WorkPosition { get { return &quot;Employee&quot;; } } 
Så har du en manager-klasse som arver fra employee, men der du vil overridde WorkPosition til å returnere &quot;Manager&quot;. Her vil du få denne advarselen, men du har kontroll og ønsker at det skal være slik. 
Nå var dette et simpelt eksempel, for det er andre bedre måter å gjøre dette på, men poenget er at selv om advarselen er godt begrunnet så er det ikke gitt at du absolutt må følge den. :-)</description>
		<content:encoded><![CDATA[<p>ReSharper advarer også mot dette.<br />
Det er absolutt en risikabel praksis, men har du kontrollen så synes jeg ikke det er noe problem å gjøre det. Noen ganger kan det tenkes at baseklassen gir en default-verdi, men at du ønsker å override denne i en subklasse.<br />
For å ta et dumt eksempel: Si at du har en Employee-klasse med en read-only property som gir WorkPosition: public virtual string WorkPosition { get { return &#8220;Employee&#8221;; } }<br />
Så har du en manager-klasse som arver fra employee, men der du vil overridde WorkPosition til å returnere &#8220;Manager&#8221;. Her vil du få denne advarselen, men du har kontroll og ønsker at det skal være slik.<br />
Nå var dette et simpelt eksempel, for det er andre bedre måter å gjøre dette på, men poenget er at selv om advarselen er godt begrunnet så er det ikke gitt at du absolutt må følge den. :-)</p>
]]></content:encoded>
	</item>
</channel>
</rss>

