www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - inheritance from abstract broken?

reply "evilrat" <evilrat666 gmail.com> writes:
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?
Jan 08 2014
next sibling parent reply Mike Parker <aldacron gmail.com> writes:
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); } }
Jan 08 2014
parent reply "evilrat" <evilrat666 gmail.com> writes:
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 :(
Jan 08 2014
parent reply "Gary Willoughby" <dev nomad.so> writes:
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); } }
Jan 08 2014
parent "evilrat" <evilrat666 gmail.com> writes:
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.
Jan 08 2014
prev sibling parent Jacob Carlborg <doob me.com> writes:
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
Jan 08 2014