D versus Objective C Comparison
grauzone
none at example.net
Mon Feb 2 13:41:20 PST 2009
Walter Bright wrote:
> Jacob Carlborg wrote:
>> It would be great if D could have categories/open classes and you
>> could do something like this:
>>
>> class A
>> {
>> void foo () {}
>> }
>>
>> class A
>> {
>> void bar () {}
>> }
>>
>> void main ()
>> {
>> auto a = new A;
>> a.foo;
>> a.bar;
>> }
>>
>> And it should of course work on classes you don't have access to the
>> source code.
>
> Setting aside the technical issues for the moment, isn't that exactly
> what inheritance is supposed to be good for?
Consider the above example is written as
> class A { int foo; }
> class B : A { int bar; }
The point is, that your code might need to associate additional data to
class A. You could inherit from that class, and simply add the fields
you need (in this case "bar"). (It's almost the same for virtual
methods, just that virtual methods are like additional fields in the
class' vtable, or something like this.)
Here's my arguments why inheritance isn't a general or elegant enough
solution:
1. If you want to extend a class with inheritance, you need to have
control about how the class is instantiated, so that you can insert your
"new B();". That's trivial in Jacob's example code. But if the "new
A();" line is hidden somewhere inside the foreign code, you obviously
can't extend the class; the foreign code will give you only not-extended
class instances. You can't cast them to B.
2. If A (or any other classes) has methods or properties, which have A
as return type, you'll probably end up having to cast from A to B each
time you want to use your extensions.
3. Inheritance works only once. There can't be two independent modules,
which both extend the class A. At least not if these two modules want to
use the same object instances. (Although the modules are independent,
they both depend and use the module which provides class A, and might
indirectly exchange object references through it. If both modules need
to "extend" them, it won't work.)
The closest to achieve something that doesn't have the above mentioned
problems, is to use a map with the object as key. For example:
> int[A] bar;
So whenever you need "bar" as additional field for A, you do an AA
lookup with the object reference as key.
But this approach has performance and garbage collection problems, and
it looks a bit ugly. The question is, is there a solution, which is both
aesthetically and technically better?
More information about the Digitalmars-d
mailing list