【问题标题】:implementing abstract class using derived types使用派生类型实现抽象类
【发布时间】:2015-01-14 12:51:56
【问题描述】:

这可能在泛型类型下的其他地方,但我似乎无法遵循很多答案。如果这是重复另一个问题,我们深表歉意。

以下代码适用于具有数据层、逻辑层和表示层的三层应用程序

在我的数据层中,我有一个实体集合和一个基础实体

public abstract class BaseEntity
{
    int LastModifiedBy { get; set; }
    DateTime LastModifiedDate{get;set;}
}


public partial class DocNum: BaseEntity
{   
}

public partial class DataList: BaseEntity
{   
}

在我的逻辑层中,我有一个用于传输数据的 BaseDTO 类。这是它的代码

public abstract class BaseDTO
{    
    protected abstract void ConvertFromEntity(BaseEntity entity);
    public abstract void ConvertToEntity();
}

然后我去创建基于它的实现类DocNum如下

public class DTODocNum : BaseDTO
{
    //properties here

    public DTODocNum()
    {
    }

    public DTODocNum(DocNum entity)
    {
        ConvertFromEntity(entity)
    }

    protected override void ConvertFromEntity(DocNum entity)
    {
        throw new NotImplementedException();
    }

    public override void ConvertToEntity()
    {
        throw new NotImplementedException();
    }
}

但是这不会编译告诉我没有找到合适的覆盖方法。 我知道我可以执行以下操作,但我希望此方法仅接受来自数据层的 DocNum 实体:

    protected override void ConvertFromEntity(BaseEntity entity)
    {
        throw new NotImplementedException();
    }

我还尝试了以下泛型类型

public abstract class BaseDTO
{
    protected abstract void ConvertFromEntity<T>(T entity);
    public abstract T ConvertToEntity<T>();        
}        

以及派生类中的以下内容:

protected override void ConvertFromEntity<T>(T entity) where T:DocNum
{
    throw new NotImplementedException();
}

但是现在给出的错误是 Constraints for override 和显式接口实现方法是从基方法继承的,所以不能直接指定

谁能帮我实现这个解决方案,以便 DTODocNum 可以在引用实体类型的同时进行编译?

【问题讨论】:

    标签: c# interface polymorphism derived-types


    【解决方案1】:

    将类型参数移动到类级别并添加约束:

    public abstract class BaseDTO<T> where T : BaseEntity
    {
        protected abstract void ConvertFromEntity(T entity);
        public abstract T ConvertToEntity();
    }
    
    public class DTODocNum : BaseDTO<DocNum> { ... }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-17
      • 2010-12-08
      • 1970-01-01
      • 2021-08-04
      • 2017-04-28
      • 2013-06-30
      • 2011-01-11
      • 2012-03-14
      相关资源
      最近更新 更多