请解释C#中抽象方法的实用性

Cod*_*arp 7 .net c#

只需5分钟的概述就可以了....

Jus*_*tin 10

public abstract class MyBaseController {
    public void Authenticate() { var r = GetRepository(); }
    public abstract void GetRepository();
}
public class ApplicationSpecificController {
    public override void GetRepository() { /*get the specific repo here*/ }
}
Run Code Online (Sandbox Code Playgroud)

这只是一些虚拟代码,它代表了我所拥有的一些真实代码(为简洁起见,这只是示例代码)

我有2个ASP MVC应用程序做了相当类似的事情.安全性/会话逻辑(以及其他事物)在两者中都是相同的.我已将两者的基本功能抽象为一个他们都继承的新库.当基类需要只能从实际实现中获取的东西时,我将它们实现为抽象方法.因此,在上面的示例中,我需要从数据库中提取用户信息以在基本库中执行身份验证.为了获得应用程序的正确数据库,我有一个抽象GetRepository方法返回应用程序的存储库.从这里开始,基地可以在repo上调用一些方法来获取用户信息并继续进行验证,或者其他任何方法.

当需要对身份验证进行更改时,我现在只需要更新一个lib而不是在两者中重复工作.所以简而言之,如果你想实现一些功能但不是全部,那么抽象类就可以很好地工作.如果要实现无功能,请使用接口.

  • 最后两句话是金子.:) (2认同)

aba*_*hev 7

public abstract class Request
{
   // each request has its own approval algorithm. Each has to implement this method
   public abstract void Approve();

   // refuse algorithm is common for all requests
   public void Refuse() { }

   // static helper
   public static void CheckDelete(string status) { }     

   // common property. Used as a comment for any operation against a request
   public string Description { get; set; }

   // hard-coded dictionary of css classes for server-side markup decoration
   public static IDictionary<string, string> CssStatusDictionary
}

public class RequestIn : Request
{
   public override void Approve() { }
}

public class RequestOut : Request
{
   public override void Approve() { }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个真实世界的例子? (6认同)
  • @Tom Womack - 抽象方法不必是公共接口的一部分.一个接口呢. (4认同)
  • 抽象类可以实现方法,因此您可能会有一些后代将调用的默认行为...您无法使用接口执行此操作. (2认同)