Method Hiding Apologia - Fabulous Adventures in Coding
Method Hiding Apologia - Fabulous Adventures in Coding
This site uses cookies for analytics, personalized content and ads. By continuing to browse this site, you agree to this use.
(http://msdn.microsoft.com/)| Developer
25 (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-
apologia/#comments)
Share 0 0 0
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 1/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 2/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 3/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 4/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 5/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 6/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 7/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 8/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 9/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 10/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 11/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 12/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 13/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 14/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 15/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 16/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 17/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 18/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 19/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 20/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 21/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 22/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 23/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 24/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 25/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 26/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 27/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
Comments (25)
Jeff Parker
May 21, 2008 at 1:56 pm (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5008)
I dunno for me this method hiding just gets confusing and starts to be spaghetti like.
For example using the following code you can see the method is not really hidden I mean it
makes sense why it isn’t but if you were to blow this out on a few classes that inherit from each
other then you can really make quite a confusing mess of things.
class Program
{
{
A a = new A();
B b = new B();
C c = new C();
D d = new D();
a.Foo();
b.Foo();
c.Foo();
d.Foo();
a = new B();
a.Foo();
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 28/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
a = new C();
a.Foo();
a = new D();
a.Foo();
}
}
class A
{
}
class B : A
{
}
class C : B
{
}
class D : C
{
}
A Foo
B Foo
C Foo
D Foo
A Foo
A Foo
A Foo
It also doesn’t seem to be able to go in reverse like a D can be an A. To me this is just not… I don;t
know the word I am looking for. maybe clean, kind of confusing, I mean I know what I did
because I wrote al the classes but you give someone just D and they do not know about B or C
and well just could lead to many problems.
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 29/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
As I see it, method hiding is the approach developers take when they can’t do the "return type
covariance" dance. It’s nice to able to hide methods and as such I think it’s definately important to
C#, but unless the developer careful about the implementation, nasty side effects may show up.
Calling the hidden method on a base type reveals the underlying implementation. You might say
that this is a desired design, but currently this is not an intuitive or natural approach to designing
an API I think.
C# needs return type covariance (the following C# implemented for illustrative purposes).
Looking forward to this feature in C# 4.0 (or C# 3.0 SP1).
class A {
class B : A {
class A {
class B : A {
Daniel Grunwald
May 21, 2008 at 2:20 pm (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5011)
Another place where method hiding is important is versioning.
If a base class adds a new method (and maybe calls it internally); method hiding allows code
compiled against the old version of the class to still run without unintended consequences. It also
allows the code to be recompiled without changing behavior – you get a compiler warning
because you’re hiding without the "new" keyword, but your program still works if you choose to
ignore the warning.
Needs? It’s managed to become a successful, useful language without return type covariance for
the last three releases over almost a decade.
Don’t get me wrong; C# is the best thing since sliced bread, but stating the language has been
succesful without return type covariance for three releases doesn’t mean it’s an un-important
feature. You’re asking for comments, and return type covariance definitely relates to method
hiding.
We have no shortage of features — we made a list of several dozens of possible features for
future versions, and the classified them into "bad idea", "not worth doing", "useful", "great", and
"must have for the next version".
Then we cut all but the last category. Then we cut about half of that. Return type covariance did
not make that first cut, much less the second.
Merely being useful is nowhere _near_ to our bar for actually designing, specifying, implementing,
testing, documenting and maintaining a feature.
Thanks for the sharing some insights on your teams decisions. It’s this kind of information that
makes it easier to uderstand the design decisions that went into the language. I spend many
hours with C# every day and have been looking for an educated answer to why return type
covariance was left out of the specs. Now, I don’t have extensive experience in the field of
language design, but it just "felt" like a "useful" feature that didn’t "seem" to have any
unintentional side effects on the current specifications.
I stated that this feature in particular is "useful", but I might have used a different adjective.
Regardless, consider this a vote on the feature.
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 31/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
A point against it is the fact that the CLR does not natively support it; in order to make it work,
the C# compiler would need to… you guessed it. Generate a hiding method with a different
signature and then having the virtual method call it. Essentially, all the compiler would be doing is
exactly what you now have to do in order to get something that looks like that, just hiding the
indirection and the cost from you.
That’s not in itself a bad thing — lots of "high level" features are things that you could plumb
together yourself — anonymous functions, iterators, "using" blocks, etc. But it does illustrate that
this would be solely a syntactic sugar, not really much of a fundamentally new feature.
configurator (http://blog.tapuchim.com)
May 22, 2008 at 1:58 am (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5017)
Since we don’t have return type covariance, we use method hiding to change the return type.
Here’s a rather silly example:
return DateTime.Now.ToShortTimeString();
return DateTime.Now.ToUniversalTime();
Note: the derived class does two things here: it changes both the return type AND the value.
we would want him to get the universal time, since this is a UniversalTimeKeeper after all and
that’s what virtual methods are for.
If there is no return type covariance, there could at least be a syntax to do both an override and a
hide:
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 32/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
return DataTime.Now.ToUniversalTime().ToShortTimeString();
return DataTime.Now.ToUniversalTime();
I know. This is a little awkuard and potentially confusing. Does anyone have a better idea?
Frederik Siekmann
May 22, 2008 at 2:14 am (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5018)
@Anders:
I have somehow ‘solved’ your problem with covariance a few times using generics. A little more
precisely I introduced an generic parameter describing the type of the derived class.
In your example:
class A<TSelf>
and
class B : A<B>
Although I used this technique a few times, I still don’t know whether this is actually a good thing
to do or a clear abuse of generics. Anyone got an opinion about that?
Weeble
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 33/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
As configurator suggests, I’m trying to do an override and a hide. I thought you might be able to
do an "explicit" override, in the same way you can explicitly implement an interface. From what
Eric says ("generate a hiding method with a different signature and then having the virtual
method call it") I guess that you have to make some arbitrary change to the parameter list of the
new MakeAnother() introduced by Derived, which seems worse than coming up with a new name
for the method.
Jeff A
May 23, 2008 at 10:14 am (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5032)
Frederick,
The main problem with your proposal is that is an evolutionary dead end with respect to
covariance. That is to say this approach only allows a one level inheritance heirarchy that
supports covariance. To achieve covariance again on a class C: B you would have to again engage
in method hiding.
It also isn’t enforcing what you think it might be. For example consider:
class D: A<D> { }
class E: A<D> { }
You probably didn’t want class E to be allowable. But that is just a matter of disciplined coding by
the consumer of class A.
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 34/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
I must however admit I have often desired a built-in psuedo-type called Self for use with
covariance.
Frederik Siekmann
May 23, 2008 at 3:51 pm (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5039)
Jeff,
I don’t know for sure if that’s the point you made, but you can allow multiple levels of hierarchy:
and so on.
Or did you meant the problem that you can cast an B<B> to A<B> but not to A<A> (or in the
above example C to B)?
Jeff A
May 24, 2008 at 11:25 pm (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5040)
Frederick,
Yes, you could extend the inheritance heirarchy in that fashion but it would require that you
declare the abstract version of each class you wanted to be extensible. This seems much the
same amount of work as just using method hiding in the first place (I suppose if you had lots of
covariant methods this would be a convenient time saver).
Yes, not being able to cast C to B is one problem. You could get around that by making all
methods that take A or B as parameters generic (i.e. public void DoSomething<Self>(B<Self>))
but that also seems like a lot of work to maintain polymorphic behaviour.
The other problem I was referring to was lets say you had:
Now we have a dog that gives birth to a cat when it reproduces!! I don’t think this is the type of
covariance you wanted to enable.
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 35/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
The reason is because it’s a _client_ feature. In other words, if the client is already compiled,
replacing the server will not affect the client behavior…
In this view ‘method hiding’ is very similar to ‘default parameters’ feature, which, as far I know,
was not included into the language because of the very same reason.
So what is the solution? In my opinion it’s extension methods, implemented by the _client_, while
the server make all its methods unambiguous.
P.S.
1. The fact that if I have an extension method ambiguous with the class method, it simply
disappears (no warning or similar) looks buggy (csc 3.5).
2. Having a possibility to implement the same interface several times along the class derivation
chain actually is an instance of the same ‘feature’. Since it’s used a lot in .Net BCL, as mono
contributor I several times fixed bugs caused by different implementation of the same interface
along the chain.
3. Q: what about IEnumerable<T>, it does not fit with the guidelines. A: To my opinion
IEnumerable<T> shouldn’t derive from IEnumerable. In general, derivation for hiding looks
problematic to me due to very hard runtime bugs, which it enables.
Javier
June 21, 2008 at 8:26 pm (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5101)
How is method hiding different from polimorphism?
Joshua
June 30, 2008 at 1:37 pm (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5137)
Konstantin Triger,
Method hiding is already part of the C# specification, so it is here to stay unless it proves to be
used by no one. (Since the CLR uses it, that is not likely)
Extension methods should be created with naming schemes that avoid that possibility as much as
possible. Try for instance using less common verbs for what you are doing. So AquireData rather
then GetData, that way you get the definition you want, and the peace of mind that there is a low
chance that the underlying developers would likely choose the simpler word over the more
"complex" one.
Warning on extension method hiding would be nice, although I suspect that it will be coming in a
future version.
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 36/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
Javier,
They have similar issues, but method hiding requires active work to get to be extremely complex
(After all it is designed to be used sparingly), compared to polymorphism’s ability to quickly mess
up everything if one of your parent classes adds a new method that matches the other parent.
Konstantin Triger
July 1, 2008 at 3:23 am (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5141)
To Joshua:
I think all this thread is a "post mortem" analysis. Clearly we won’t be able to remove this feature.
Yet we want understand whether it was the right thing to do, so we will be able to recommend
better practices, add FxCop rules etc.
The main point of my post is that Extension methods could give a reasonable solution to the
problem, if and only if the compiler would make them to precede in name resolution chain, i.e.:
class Y {
Console.WriteLine("Y");
}
class X : Y {
Console.WriteLine("X");
}
x.testEx();
}
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 37/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
About my and your #3 P.S.: Following your logic IEnumerable<T> should be also
IEnumerable<object>, which is not the case. If due to some reason you need to convert your
IEnumerable<T> to IEnumerable, one way would be a method like this:
foreach (T t in e)
yield return t;
Of course that’s not needed, since IEnumerable<T> derives from IEnumerable, but what would
you do if you needed to convert IEnumerable<T> to IEnumerable<X>, provided T derives from X?
Alex Grenier
July 3, 2008 at 3:28 pm (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5145)
To me, the usefulness of hiding is to change the result of a method call based on which subtype it
gets casted to. This is a good way to "downgrade specialization". Think of a scenario where such a
type gets passed to methods where the parameter may be defined as type A or type B – thus
altering the behavior of the passed object.
The reason IEnumerable<T> needs to implement IEnumerable but doesn’t need to worry about
implementing IEnumerable<object> is so that a reference to IEnumerable<T> can be used with
code that pre-dates generics. For example:
// …
OldFoo(bars);
While you could say the same thing about IEnumerable<object>, there are well known ways
around that problem (using generic methods instead of IEnumerable<object>, for example),
whereas with pre-generic code the only workaround is writing a wrapper class. Also, generic
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 38/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
covariance, if it ever gets added to the language, will take care of the IEnumerable<object>
problem, whereas it can’t take care of the IEnumerable problem since they are two different types.
Nick
November 5, 2008 at 4:06 am (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-5528)
Personally, programming is not about creating frankenstein concepts. This cake example in my
view demonstrates exactly how not to use these concepts. Consider the scenario when a
programmer (possibly new to the project) is tasked with calculating tax on a bunch of items, and
creates a list of generic groceries, only to calculate the wrong tax because of the frankenstein
relationships. Programming is hard enough right?
I understand there could be situations where one can make use of method hiding; but it seems
pretty non-intuitive by breaking how people expect polymorphism and your API to work.
I won’t say I’ll never use it.. but I hope I never do; because it seems that if you’re having to do a
lot of funky method hiding then your object hierarchy is probably pretty hosed.
Bottom line I just see very little advantage to using method hiding over method overriding. The
latter is much more intuitive and is how most people expect things to work. The examples given
are relatively simple yet still somewhat confusing – I don’t even want to think how much damage
you could do by hiding methods in larger chunks of code.
cheers,
– bri
Ralph Compton
August 3, 2009 at 10:59 am (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-7311)
I still don’t see why the language includes both method overriding and hiding. Can this be
explained without a reference to covariance?
Jeremy S. Pederson
March 9, 2011 at 10:37 pm (https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-
hiding-apologia/#comment-11285)
I personally like this feature… backwards compatibility
{
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 39/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
this.ISomeInterface = someInterface;
}
: base(someInterface) { }
{
}
{
}
//new factory method that lets the caller initialize a new version of the communication object
without breaking old code
{
}
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 40/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
(https://blogs.msdn.microsoft.com/ericlippert/feed/)
Popular Tags
C# (https://blogs.msdn.microsoft.com/ericlippert/tag/c/)
Scripting (https://blogs.msdn.microsoft.com/ericlippert/tag/scripting/)
JScript (https://blogs.msdn.microsoft.com/ericlippert/tag/jscript/)
VBScript (https://blogs.msdn.microsoft.com/ericlippert/tag/vbscript/)
Puzzles (https://blogs.msdn.microsoft.com/ericlippert/tag/puzzles/)
Rants (https://blogs.msdn.microsoft.com/ericlippert/tag/rants/)
Performance (https://blogs.msdn.microsoft.com/ericlippert/tag/performance/)
Security (https://blogs.msdn.microsoft.com/ericlippert/tag/security/)
C# 4.0 (https://blogs.msdn.microsoft.com/ericlippert/tag/c-4-0/)
Non-computer (https://blogs.msdn.microsoft.com/ericlippert/tag/non-computer/)
SimpleScript (https://blogs.msdn.microsoft.com/ericlippert/tag/simplescript/)
Immutability (https://blogs.msdn.microsoft.com/ericlippert/tag/immutability/)
Pages (https://blogs.msdn.microsoft.com/ericlippert/tag/pages/)
Recursion (https://blogs.msdn.microsoft.com/ericlippert/tag/recursion/)
Books (https://blogs.msdn.microsoft.com/ericlippert/tag/books/)
Archives
November 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/11/) (5)
October 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/10/) (5)
September 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/09/) (2)
August 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/08/) (5)
July 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/07/) (2)
June 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/06/) (6)
May 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/05/) (2)
April 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/04/) (5)
March 2012 (https://blogs.msdn.microsoft.com/ericlippert/2012/03/) (3)
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 41/42
11/22/2019 Method Hiding Apologia – Fabulous Adventures In Coding
https://blogs.msdn.microsoft.com/ericlippert/2008/05/21/method-hiding-apologia/ 42/42