Thread overview
inheritance from abstract broken?
Jan 08, 2014
evilrat
Jan 08, 2014
Mike Parker
Jan 08, 2014
evilrat
Jan 08, 2014
Gary Willoughby
Jan 08, 2014
evilrat
Jan 08, 2014
Jacob Carlborg
January 08, 2014
Greetings everyone,

i have the code where i have to keep pointers to so storage(context dependent stuff), so i tried declare abstract class with ctors and it didn't worked.

------- [code]

class MyContext;

abstract class MyObject
{
   // yet another bug? all descendants errors no default ctor...
   this() {}

   this(MyContext mc)
   {
   }

   MyContext _owner;
}

class MyObjectA : MyObject
{ ... }

//inside MyContext.CreateObj
MyObject CreateMyObj()
{
auto obj = new MyObjectA(this) // two errors produced

... do something with obj before returning it ...
return obj;
}

errors:
-----------
Error: no constructor for MyObjectA
Error: constructor MyObjectA.this () is not callable using argument types (MyContext)
--------

am i wrong about abstract classes usage in D or this is a bug?
January 08, 2014
On 1/8/2014 9:22 PM, evilrat wrote:
> Greetings everyone,
>
> i have the code where i have to keep pointers to so storage(context
> dependent stuff), so i tried declare abstract class with ctors and it
> didn't worked.
>
> ------- [code]
>
> class MyContext;
>
> abstract class MyObject
> {
>     // yet another bug? all descendants errors no default ctor...
>     this() {}
>
>     this(MyContext mc)
>     {
>     }
>
>     MyContext _owner;
> }
>
> class MyObjectA : MyObject
> { ... }
>
> //inside MyContext.CreateObj
> MyObject CreateMyObj()
> {
> auto obj = new MyObjectA(this) // two errors produced
>
> ... do something with obj before returning it ...
> return obj;
> }
>
> errors:
> -----------
> Error: no constructor for MyObjectA
> Error: constructor MyObjectA.this () is not callable using argument
> types (MyContext)
> --------
>
> am i wrong about abstract classes usage in D or this is a bug?

You're constructing a MyObjectA instance, not a MyObject, so the compiler is looking for a constructor in MyObjectA that takes a MyContext param.

class MyObjectA : MyObject {
   this(MyContext mc) {
      super(mc);
   }
}
January 08, 2014
On Wednesday, 8 January 2014 at 12:29:48 UTC, Mike Parker wrote:
> On 1/8/2014 9:22 PM, evilrat wrote:
>> Greetings everyone,
>>
>> i have the code where i have to keep pointers to so storage(context
>> dependent stuff), so i tried declare abstract class with ctors and it
>> didn't worked.
>>
>> ------- [code]
>>
>> class MyContext;
>>
>> abstract class MyObject
>> {
>>    // yet another bug? all descendants errors no default ctor...
>>    this() {}
>>
>>    this(MyContext mc)
>>    {
>>    }
>>
>>    MyContext _owner;
>> }
>>
>> class MyObjectA : MyObject
>> { ... }
>>
>> //inside MyContext.CreateObj
>> MyObject CreateMyObj()
>> {
>> auto obj = new MyObjectA(this) // two errors produced
>>
>> ... do something with obj before returning it ...
>> return obj;
>> }
>>
>> errors:
>> -----------
>> Error: no constructor for MyObjectA
>> Error: constructor MyObjectA.this () is not callable using argument
>> types (MyContext)
>> --------
>>
>> am i wrong about abstract classes usage in D or this is a bug?
>
> You're constructing a MyObjectA instance, not a MyObject, so the compiler is looking for a constructor in MyObjectA that takes a MyContext param.
>
> class MyObjectA : MyObject {
>    this(MyContext mc) {
>       super(mc);
>    }
> }

ok. gotta using mixins :(
January 08, 2014
On 2014-01-08 13:22, evilrat wrote:
> Greetings everyone,
>
> i have the code where i have to keep pointers to so storage(context
> dependent stuff), so i tried declare abstract class with ctors and it
> didn't worked.
>
> ------- [code]
>
> class MyContext;
>
> abstract class MyObject
> {
>     // yet another bug? all descendants errors no default ctor...
>     this() {}
>
>     this(MyContext mc)
>     {
>     }
>
>     MyContext _owner;
> }
>
> class MyObjectA : MyObject
> { ... }
>
> //inside MyContext.CreateObj
> MyObject CreateMyObj()
> {
> auto obj = new MyObjectA(this) // two errors produced
>
> ... do something with obj before returning it ...
> return obj;
> }
>
> errors:
> -----------
> Error: no constructor for MyObjectA
> Error: constructor MyObjectA.this () is not callable using argument
> types (MyContext)
> --------
>
> am i wrong about abstract classes usage in D or this is a bug?

Unfortunately constructors are not inherited.

-- 
/Jacob Carlborg
January 08, 2014
On Wednesday, 8 January 2014 at 12:40:39 UTC, evilrat wrote:
> ok. gotta using mixins :(

Just use another ctor.

class MyObjectA : MyObject
{
    this(MyContext mc)
    {
        super(mc);
    }
}
January 08, 2014
On Wednesday, 8 January 2014 at 14:01:43 UTC, Gary Willoughby wrote:
> On Wednesday, 8 January 2014 at 12:40:39 UTC, evilrat wrote:
>> ok. gotta using mixins :(
>
> Just use another ctor.
>
> class MyObjectA : MyObject
> {
>     this(MyContext mc)
>     {
>         super(mc);
>     }
> }

i do this in template. just a bit sad using mixin everywhere.