是否可以为不同类型创建通用抽象父类?

时间:2016-05-27 12:25:39

标签: c# generics inheritance abstract-class

我很好奇是否有可能创建父抽象类,我可以定义一组特定的方法,但是子类包含不同的实体类型?代码示例:

public abstract class BaseService
{
    public abstract void Add();

    public abstract void Delete();

    public abstract void Update();

    public abstract void Get();        
}

也许可以做public abstract List<'random type'> GetAll();

之类的事情

但是在这里我想要使用特定于每个子节点的特定参数覆盖每个方法:

public class CategoryService : BaseService
{
    public override void Add(){ }

    public override void Delete(){ }

    public override void Update(){ }

    public override void Get(){ }
}

但是,在我的子课程中,我希望我的Get()方法返回一个特定的List&lt;“of Type”&gt; (在这种情况下类别)。此外,我可能希望public override Add(int CategoryID)代替Add中的继承BaseService

这可能吗?思考?我只是疯了吗?或者我是否想让它变得比它需要的更复杂?我有大约10种不同的服务类型,我希望确保从BaseService获取这些通用方法。

提前致谢!

3 个答案:

答案 0 :(得分:4)

如果我理解正确,你可以这样做:

public abstract class BaseService<T>
{
    public abstract T Get();        
}

然后:

public class CategoryService : BaseService<Category>
{
    public override Category Get(){ ... }
}

您无法覆盖方法并在覆盖中使用不同的签名,但您可以使用字典/散列表或更奇特的东西将参数传递到Add方法。使用通用容器传递参数意味着您开始使用查询模式,其中容器中的参数确定查询(仅用于信息: - ))。

答案 1 :(得分:1)

尝试使用通用类型

public abstract List<T> GetAll<T>();

并在您的子课程中返回适当的类型

<强>更新

@ pw94回答也是实现这一目标的好方法,但唯一的问题是你不能为不同的方法提供多种类型,只有一种类型在你继承类后才能工作。

答案 2 :(得分:0)

您可以创建抽象泛型类:

public abstract class BaseService<T>
{
    public abstract void Add();

    public abstract List<T> Get();        
}

并实施:

public class CategoryService : BaseService<int>
{
    public override void Add(){ ... }

    public override List<int> Get(){ ... }
}