The impoliteness of overriding methods

Jacob Carlborg doob at me.com
Wed Dec 19 23:26:18 PST 2012


On 2012-12-20 01:06, H. S. Teoh wrote:
> On Thu, Dec 20, 2012 at 12:11:34AM +0100, Andrej Mitrovic wrote:
>> Some interesting blog post:
>> http://journal.stuffwithstuff.com/2012/12/19/the-impoliteness-of-overriding-methods/
>>
>> It's a post about a common problem in class design, I've ran into it a
>> few times in D too.
> [...]
>
> Interesting concept. So "polite" overriding is simply a kind of override
> where the derived class method has a vtable entry separate from the base
> class method's entry (and thus needs explicit invocation from the base
> class), whereas the usual "impolite" overriding is a kind of override
> where the derived class method replaces the vtable entry of the base
> class method.
>
> I can see use cases for both kinds of overriding.
>
> Interestingly enough, in the "polite" overriding case, the call to inner
> is undefined until it's defined in the derived class. Which means that a
> method that calls inner is a kind of pseudo-abstract method (since
> abstract methods are those that *must* be implemented by the derived
> class). So if we were to implement this in D, we could extend the
> meaning of 'abstract':
>
> 	class Base {
> 		// The current, usual overridable method
> 		void replaceMe() {
> 			writeln("A");
> 		}
>
> 		// Abstract, because chain(chainMe) is undefined until
> 		// the derived class implements it.
> 		abstract void chainMe() {
> 			writeln("B");
> 			inner.chainMe(); // call derived class method
> 					// 'inner' is a tentative
> 					// keyword
> 			writeln("C");
> 		}
> 	}
>
> 	class Derived : Base {
> 		override replaceMe() {
> 			writeln("D");
> 			Base.replaceMe();
> 			writeln("E");
> 		}
>
> 		// Base.chainMe is abstract, so we have to implement
> 		// this method.
> 		override void chainMe() {
> 			writeln("F");
> 		}
> 	}
>
> 	void main() {
> 		auto d = new Derived();
> 		d.replaceMe();	// prints D A E
> 		d.chainMe();	// prints B F C
> 	}
>
>
> T
>

What's the difference compared to calling "super".

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list