something "weird" about polymorphism

Chris Nicholson-Sauls ibisbasenji at gmail.com
Sun Nov 15 13:31:46 PST 2009


funog wrote:
> downs wrote:
>> funog wrote:
>>> The following code :
>>>
>>> ------------------
>>> import std.stdio;
>>> class A {
>>>     void foo(A a) {
>>>         writefln("A");
>>>     }
>>> }
>>>
>>> class B : A {
>>>     void foo(B b) {
>>>         writefln("B");
>>>     }
>>> }
>>>
>>> void main() {
>>>     B b = new B;
>>>     A a = b;
>>>     assert(a is b);
>>>     b.foo(b);
>>>     a.foo(b);
>>> }
>>> --------------
>>> outputs:
>>> B
>>> A
>>>
>>>
>>> This is understandable as B.foo doesn't actually overrides A.foo. But
>>> somehow it's weird to get different outputs while "a" and "b" are
>>> basically the same object. Has anyone else encountered this problem in
>>> real life? Will C+++, java act the same way?
>>>
>>
>> The behavior here is entirely correct and, in fact, could not happen 
>> any other way.
>>
>> The only improvement would be disallowing declaring methods that 
>> shadow but don't override methods in the super class.
>>
> 
> 
> This is the point, I think it should be disallowed (particularly in D, 
> since shadowing declarations are deprecated). I understand that B.foo 
> doesn't override A.foo, but I mean, you have the same object, the same 
> function (name), the same parameter... and a different result.
> Well, I'm not a pro so I don't know how error-prone it can be in "real 
> life".
> 

Same object, same method, same parameter... but different interface and potentially 
different invariant on that interface.  Sometimes this is a Good Thing, sometimes its a 
Bad Thing.  When it is a Bad Thing, you can generally accomplish what you want with 
"final" -- but certainly not always!

Might be another tick on the "advantages" side of using non-virtual interfaces.

-- Chris Nicholson-Sauls



More information about the Digitalmars-d-learn mailing list