2011-11-30 85 views
0

在我的Silverlight 4应用程序,我开始创建和使用一些仿制药,现在我偶然发现了以下问题的方法:重写返回一个泛型类

在非通用类,我有一个抽象的方法,即返回一个通用类:

public abstract class DTO_Base() 
{ 
    public abstract ServiceModelBase<ServiceNodeBase> CreateBusinessObject(); 
} 

通用类以下述方式定义:

public abstract class ServiceModelBase<RootNodeType> where RootNodeType : ServiceNodeBase 

自然地,从DTO_Base派生类将有重写的Cr eateBusinessObject方法:

public class DTO_Editor : DTO_Base 
{ 
    public override ServiceModelBase<ServiceNodeBase> CreateBusinessObject() 
    { 
    // the object to return have to be of type ServiceModelEditor 
    // which is derived from ServiceModelBase<ServiceNodeEditor> 
    // public class ServiceModelEditor : ServiceModelBase<ServiceNodeEditor> 

    // ServiceNodeEditor is derived from ServiceNodeBase 
    // public class ServiceNodeEditor : ServiceNodeBase 
    ServiceModelEditor target = new ServiceModelEditor() 

    ... 
    Functions to populate the 'target' 
    ... 

    return target; 
    } 
} 

该行return target;会导致错误,指出不可能将ServiceModelEditor类型隐式转换为ServiceModelBase<ServiceNodeBase>。此外,通过目标显式转换为ServiceModelBase<ServiceNodeBase>不起作用。

我该如何执行这个方法才能工作?

回答

1

试试这个:

public interface IDTO<Node> where Node : ServiceNodeBase 
{ 
    ServiceModelBase<Node> CreateBusinessObject(); 
} 
public abstract class DTO_Base<Model,Node> : IDTO<Node> 
    where Model : ServiceModelBase<Node> 
    where Node : ServiceNodeBase 
{ 
    public abstract Model CreateBusinessObject(); 


    #region IDTO<Node> Members 

    ServiceModelBase<Node> IDTO<Node>.CreateBusinessObject() 
    { 
     return CreateBusinessObject(); 
    } 

    #endregion 
} 

public class DTO_Editor : DTO_Base<ServiceModelEditor, ServiceNodeEditor> 
{ 

    public override ServiceModelEditor CreateBusinessObject() 
    { 
     // the object to return have to be of type ServiceModelEditor 
     // which is derived from ServiceModelBase<ServiceNodeEditor> 
     // public class ServiceModelEditor : ServiceModelBase<ServiceNodeEditor> 

     // ServiceNodeEditor is derived from ServiceNodeBase 
     // public class ServiceNodeEditor : ServiceNodeBase 
     ServiceModelEditor target = new ServiceModelEditor(); 


     return target; 

    } 
} 

我以前遇到类似的问题,唯一合理的做法是使核心基类也是通用的。您可以删除Model通用参数(和界面),它看起来不那么可怕,但您在方法之外忽略了ServiceModelEditor的功能。

+0

非常感谢,这个作品!即使没有界面,那么,您创建的界面是否能够保护我免受以后的麻烦? – Aaginor

1

就这样,你已经得到返回ServiceModelBase<ServiceNodeBase>。一种选择是让你的基类通用:

public abstract class DtoBase<T> where T : RootNodeType 
{ 
    public abstract ServiceModelBase<T> CreateBusinessObject(); 
} 

然后:

public class DtoEditor : DtoBase<ServiceNodeBase> 
{ 
    public override ServiceModelBase<ServiceNodeBase> CreateBusinessObject() 
    { 
     ... 
    } 
} 
+0

“公共类DtoEditor:DtoBase ”我认为 –

+0

@KooKiz:我不这么认为 - 不是从方法的返回值。尽管如此,ServiceModelEditor必须从ServiceModelBase 派生。 –

+0

是的,但是ServiceModelEditor派生自ServiceModelBase

0

如果您使用的是.NET 4.0,我建议你使用接口来定义ServiceModelBase,并指定对一个out方差修改接口泛型类型:

class ServiceNodeBase { } 
class ServiceNodeEditor : ServiceNodeBase {/*implementation*/} 
// 
interface IServiceModelBase<out RootNodeType> 
    where RootNodeType : ServiceNodeBase { 
} 
class ServiceModelEditor : IServiceModelBase<ServiceNodeEditor> { 
    /*implementation*/ 
} 
// 
abstract class DTO_Base { 
    public abstract IServiceModelBase<ServiceNodeBase> CreateBusinessObject(); 
} 
class DTO_Editor : DTO_Base { 
    public override IServiceModelBase<ServiceNodeBase> CreateBusinessObject() { 
     return new ServiceModelEditor(); 
    } 
}