[Grace-core] Inheritance: what is it meant to be good for?
Alex.Potanin at ecs.vuw.ac.nz
Alex.Potanin at ecs.vuw.ac.nz
Tue Dec 9 22:50:28 PST 2014
Hello,
I must have missed the discussion before, but I am just wondering - why
inheritance? Why not have delegation or other composition mechanisms and
omit it entirely?
Thanks,
Alex.
> I thought it might be best to specify my minimum needs for inheritance,
> leaving room for adding new things if there are good reasons.
>
> 1. We need single inheritance on classes and on immutable objects, when
> we have access to the compete definitions of the super-class/super-object.
> I.e., at the point of definition, we have complete knowledge of all
> features of the superclass/object, including confidential features. This
> allows us to know when we are overriding existing features and (very
> importantly) knowing when we might be (illegally) overloading features.
>
> It is handy to be able to inherit from newly formed objects so that we can
> get the initialization right, but it is not part of the minimal needs for
> inheritance in my view.
>
> 2. When inheriting we can add new features (defs, vars, and methods) as
> well as override existing methods. I'm less sure about overriding an
> existing (confidential) def or var by a method. (Public defs and vars are
> already represented by methods, so they are fine.) Overriding other
> features makes me nervous, but perhaps unnecessarily.
>
> 3. Initialization of objects formed using inheritance (actually all are,
> since all inherit from top object): First the complete object is laid
> out, with slots for defs, vars, and methods, both inherited and newly
> defined. Methods are then associated with their slots -- those defined in
> the object/class can be inserted directly. Any not overridden can be
> inserted from the parent. Then the initialization code from the
> superclass/object is run, followed by the initialization code from the
> object being defined. The initialization code shall be run with the
> object being defined as the value of self. Thus if initialization code
> (even in the superclass) executes a method that has been overridden then
> the new version will be executed. This of course raises the possibility
> that a new method called from the superclass initialization code might
> access a def or var that has not yet been initialized, but I consider that
> the programmers responsibility to make sure that doesn't hap!
> pen.
>
> Subclasses/object may invoke superclass methods by super.m(...). This
> just allows the invocation of such methods in a context where self is the
> (sub)object being defined.
>
> The above is necessary in order to build the kind of frameworks that i
> need for my graphics system, where students update fixed methods that are
> pre-wired to respond to events.
>
> 4. I would like the static type system to be able to constrain
> inheritance so that overriding one method is guaranteed not to break
> another (inherited) method in the same class. At the moment, I'm not sure
> what, if any, constraints that puts on the dynamically typed system.
>
> 5. Finally, inheritance should look familiar to those used to Java, C++,
> Scala, etc. This is necessary both to convince instructors to use it, but
> also to make it easier to transition from Grace to one of those languages.
> Of course they are inconsistent with each other (e.g., with
> initialization), but I'm sure you get my drift ...
>
> I'm sure I'm leaving some stuff out here, but let's take this as the start
> of the conversation. Questions?? Comments?
>
> [There are likely other things that I can be convinced should be part of
> inheritance, but I've just tried laying out the minimum I need in order to
> teach my intro course(s).]
>
>
> Kim
>
>
>
>
> _______________________________________________
> Grace-core mailing list
> Grace-core at cecs.pdx.edu
> https://mailhost.cecs.pdx.edu/mailman/listinfo/grace-core
>
More information about the Grace-core
mailing list