Some ideas based on feedback to the Why inheritance never made any sense:
Feedback: Subtypes are necessary
The only one of these that is practically workable is behaviour inheritance <=> subtype inheritance: I’m sorry that you were exposed to Java at such an impressionable age. The compilers of languages like Java enable subclass = subtype, by automatically assuming that a subclass is is a valid value for variable binding, for example. However they do nothing to ensure subclass = subtype. This is valid C#, a language very like Java for this discussion:
namespace QuickTestThing
{
class Class1
{
override public string ToString()
{
return "Class1";
}
}
class Class2 : Class1
{
public override string ToString()
{
throw new Exception();
}
}
}
Now is Class2
a subtype of Class1
? Does the compiler let you pretend that it is?
You don’t even need inheritance
As discussed in the original post, the whole “favour composition over inheritance” movement gets by fine with no inheritance. Composition and delegation (I don’t know about this message, I’ll forward it to someone who does) let you get the same behaviour.
Feedback: build it yourself
Can I demonstrate a language that has all three of subtype inheritance, behaviour inheritance, and categorical inheritance as distinct language features? Yes, but I would need to learn Racket first. I’m on it.
But in the meantime, re-read the “you don’t even need inheritance” paragraph and think about how you would build each of those three ideas out of delegation.