抽象类的驱动类中的额外方法

本文关键字:方法 抽象类 | 更新日期: 2023-09-27 18:02:13

我知道这个问题已经被问过很多次了。但是看着答案,我找不到合适的或者适合我的。

假设我有一个抽象类

public abstract class EntityService<T>
{
     public T GetAll()
     {
         //Implementation
     }
}
然后我有一个驱动类
public class UserService : EntityService<User>
{
      public User GetAll(string Orderby)
      {
          //Implementation
      }
}

我为UserService创建了一个静态变量,以便在整个项目中使用它。

public static readonly EntityService<User> UserService = new UserService();

使用UserService.GetAll();将工作得很好。然而,当我想使用UserService.GetAll("Acsending");会给出一个编译器错误说这个方法不存在。我知道我必须将它转换为UserService类型,但我不能这样做。我把(UserService)它总是给出错误,我想知道是否有一个更好的方法来做到这一点,没有铸造它,因为我想写我的代码平原和简单的可能。

抽象类的驱动类中的额外方法

我认为这样做对你的情况会很有用,抱歉有点晚了,但是:

public interface IUserService
{
    User GetAll();
    User GetAll(string OrderBy);
}
public abstract class EntityService<T>
{
    public T GetAll()
    {
       //Implementation
    }
}
public class UserService : EntityService<User>, IUserService
{
    public User GetAll(string OrderBy) 
    {
       //Implementation
    }
}

然后像这样使用:

public static readonly IUserService UserService = new UserService();
....
UserService.GetAll();
UserService.GetAll("orderByColumn");

如果你想要一些实体的通用代码,你可以这样写:

 void ForEntityMethod(EntityService<T> entityService)

如果是用户专用的,即:

 void ForUserMethod(IUserService userService)

它认为它给你更多的灵活性,避免在你的情况下被铸造。也存在其他好的变体,但如果您对系统有一些未来的愿景,可以使用它们。

您需要像这样将变量声明为子类:

public static readonly UserService userService = new UserService();

或者,每次你想使用EntityService<User>作为UserService:

var userServiceDownCast = (UserService)userService;
userServiceDownCast.GetAll("Ascending");