抽象类

时间:2015-07-10 19:58:08

标签: c# inheritance abstract

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

我们说我有一个抽象类

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 Type,但我无法做到。我把它放在哪里(UserService)它总是给出错误,我想知道有没有更好的方法来做到这一点而不强制它,因为我想尽可能简单和简单地编写我的代码。

2 个答案:

答案 0 :(得分:2)

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

<div id="content">

  <nav id="navlist" class="logo-center nav-overlay">
    <div class="row">
      <div class="medium-4 columns text-right">
        <ul class="menu ">
          <li><a href="index.php " id="homenav">Home</a>
          </li>
          <li><a href="reserve.php " id="reservenav">Reservations</a>
          </li>
          <li><a href="menus.php " id="menusnav">Menus</a>
          </li>
        </ul>
      </div>

      <div class="medium-4 columns text-center">
        <a href="index.php ">
          <img alt=" " src="img/logo_medium.png" class="logo medium-7 ">
        </a>
        <a href="index.php ">
          <img alt=" " src="img/logo-dark.png" class="logo logo-dark medium-10 ">
        </a>
      </div>

      <div class=" medium-4 columns text-left ">
        <ul class="menu ">
          <li><a href="location.php " id="locationnav">Find us</a>
          </li>
          <li><a href="history.php " id="historynav">History</a>
          </li>
          <li><a href="contact.php " id="contactnav">Contact</a>
          </li>
        </ul>
      </div>
      <div class="nav-toggle "><i class="icon icon_menu "></i>
      </div>
    </div>
  </nav>
</div>

然后像这样使用它:

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)

它认为它可以为您提供更大的灵活性,并避免在您的情况下投射。 还存在另一个好的变体,但如果你有一些未来的系统愿景,它们就可以使用。

答案 1 :(得分:1)

您需要将变量声明为子类,如下所示:

public static readonly UserService userService = new UserService();

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

时,您都会向下转发
var userServiceDownCast = (UserService)userService;
userServiceDownCast.GetAll("Ascending");
相关问题