2015-01-14 3 views
0

это может быть где-то еще под универсальными типами, но я не могу следовать многим ответам. Извините, если это повторение другого вопроса.реализация абстрактного класса с использованием производных типов

следующий код для приложения на три слоя с данными, представления и логики слоев

в моем слое данных у меня есть коллекция из entitys и базовую сущность

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


public partial class DocNum: BaseEntity 
{ 
} 

public partial class DataList: BaseEntity 
{ 
} 

в моей логике слоя I имеют класс 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(); 
    } 
} 

однако это не будет компилироваться говорить мне, что ни один подходящий метод для переопределения не был найден. Я знаю, что я могу сделать следующее, но я хочу thhis метод принимает только 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(); 
} 

но теперь ошибка определяется является Ограничение для переопределения и явных методов реализации интерфейса унаследованы от базы метод, поэтому они не могут быть указаны напрямую

Может ли кто-нибудь помочь мне реализовать это решение, чтобы DTODocNum мог компилироваться, ссылаясь на тип сущности?

ответ

2

Переместить параметр типа на уровне класса и добавить ограничение:

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

public class DTODocNum : BaseDTO<DocNum> { ... } 
+0

Ok, которая работает лечить ... вау спасибо за быстрый ответ – ChrisOBrien

Смежные вопросы