D versus Objective C Comparison

Nick Sabalausky a at a.a
Mon Feb 2 15:58:41 PST 2009


"grauzone" <none at example.net> wrote in message 
news:gm7pa1$2tjg$1 at digitalmars.com...
> 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?

Umm, go into class A and add whatever you need? 





More information about the Digitalmars-d mailing list