2016-04-21 63 views
-4

我有一个使用“DTO”类(即来自DB的原始数据)构建的“域模型”类的DDD类型解决方案。如果抽象基类包含参数化构造函数(并且派生不),为什么不能使用它?

域模型类都从一个抽象基类继承,它旨在提供泛型注入/检索DTO数据。下面是一个示例:

public abstract class DomainModelBase<T> where T : IDto, new() 
{ 
    protected T _data; 

    protected DomainModelBase() 
    { 
     _data = new T(); 
    } 

    protected DomainModelBase(T data) 
    { 
     _data = data; 
    } 

    protected void SetData(T data) 
    { 
     _data = data; 
    } 

    public T GetData() 
    { 
     return _data; 
    } 
} 

public class AttributeOption : DomainModelBase<AttributeOptionData> 
{ 
    //public AttributeOption(AttributeOptionData data) 
    //{ 
    // SetData(data); 
    //} 
} 

我认为(因为DomainModelBase包含一个参数化的构造函数),我将能够做到这一点:

 var data = new AttributeOptionData(); 
     var model = new AttributeOption(data); 

然而,编译器说:“构造‘AttributeOption’具有零个参数,但用一个参数调用“。使其工作的唯一方法似乎是在派生类中创建一个参数化的构造函数(如上面注释过的那样)。

有没有办法通过修改基类来完成这项工作,即不需要在每个派生类中设置参数化构造函数?

+0

构造函数不被继承。请参阅Stack Overflow引用的标记副本,当然还有官方引用的C#文档和规范。这在语言手册,参考文献等中有明确的描述。 –

回答

0

不,你不能。

这是一个限制,说'每个派生类应该使用(隐式或显式)至少一个基类的构造函数。

在你的例子中,你的子类隐含地具有无参数的构造函数,它隐式地使用来自基类的无参数构造函数。因此,您需要:在每个派生类中设置参数化构造函数或从基类中删除此构造函数。

或者,你可以尝试这样的事情:

public class AttributeOption : DomainModelBase<AttributeOptionData> 
{ 
    public AttributeOption(AttributeOptionData data) : base(data) { } 
} 

这不是你到底想要什么,但我们所拥有的。

相关问题