【问题标题】:Is it possible to create a generic abstract parent class for different types?是否可以为不同类型创建通用抽象父类?
【发布时间】:2016-09-25 19:08:43
【问题描述】:

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

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 (在本例中为 Category)。此外,我可能想做public override Add(int CategoryID) 而不是从BaseService 继承的Add

这可能吗?想法?我只是疯了吗?还是我试图使这比需要的更复杂?我有大约 10 种不同的服务类型,我想确保从 BaseService 获取这些通用方法。

提前致谢!

【问题讨论】:

  • 如果您要在所有子类中为Add 设置不同的参数,那么通过在基类中定义这些参数您会获得什么?
  • I might want to do public override Add(int CategoryID) instead of the inherited Add from BaseService. 那你为什么要使用override 关键字呢?

标签: c# generics inheritance abstract-class


【解决方案1】:

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

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

然后:

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

您不能覆盖方法并在覆盖中使用不同的签名,但您可以使用字典/哈希表或其他更花哨的东西将参数传递给Add 方法。使用通用容器传递参数意味着您开始使用 query 模式,其中容器中的参数决定查询(仅用于信息 :-))。

【讨论】:

  • 这正是我想要的!我正朝着这个方向前进,但不是 100% 确定...谢谢!
【解决方案2】:

尝试使用泛型

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

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

更新

@pw94 的回答也是实现这一点的好方法,但唯一的问题是你不能为不同的方法设置多种类型,一旦你继承了类,只有一种类型可以工作。

【讨论】:

    【解决方案3】:

    您可以创建抽象泛型类:

    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(){ ... }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多