【问题标题】:What is the difference between non-static method and static method of an abstract class?抽象类的非静态方法和静态方法有什么区别?
【发布时间】:2016-04-20 11:22:42
【问题描述】:

我知道在抽象类中使用静态方法不是最佳实践,但是如果我在抽象类中同时使用静态和非静态方法有什么区别。

我假设调用这些方法没有区别,因为我们不能为抽象类创建实例,所以我们可以只使用类名来调用静态和非静态方法。

除了关键字“静态”之外,它们之间还有其他区别吗?

例如: 抽象类:

abstract public class AbstractClass
{
    #region Constructor
    protected AbstractClass(Args args): this(args)
    {
    }
    #endregion

    #region public static methods

    public static object FormLoad(Args args)
    {
        //Logic 
    }

    public static object Sample(Args args)
    {
        //Logic
    }

    #endregion


    #region Public non-static methods

    public AbstractClass CreateResponse(Args args)
    {
        //Logic
    }

    public void ClearDialog()
    {
        //Logic
    }

    #endregion

    #region Abstract Method
    abstract protected void Responses();
    #endregion

}

派生类:

   public class DerivedClass : AbstractClass
   {
    #region Public Constructors

    public DerivedClass(Args args)
        : base(args)
    {
    }

    #endregion

    #region Protected Methods

    protected override void Responses()
    {
        //logic
    }

    #endregion
    }

【问题讨论】:

    标签: c# access-modifiers


    【解决方案1】:

    让我试着回答你的两个问题 -

    我知道在 Abstract 中使用静态方法不是最佳实践 类,但是如果我同时使用静态和非静态有什么区别 抽象类中的方法

    在您的抽象类中同时拥有静态和非静态方法是合法的,是的,您认为在抽象类中使用静态方法不是最佳实践是正确的。当我将abstract 类概念化时,它应该是无形的,只是抽象的,就像 Shape 一样。只有当某个类继承了一个抽象类时,它才会在现实世界(如圆形或方形)中获得生命并有意义。所以是的,您可以像使用任何其他类一样使用静态和非静态方法,这对抽象类毫无意义。

    调用这些方法有什么不同吗?当静态方法 将调用一个抽象的,因为我们不能为一个 抽象类。

    您可以像往常一样在类的实例上调用非静态方法,是的,您是对的 我们不能为抽象类创建对象,静态方法会直接用这样的类名调用,并且在编译器执行语句时立即调用。

    MyAbstractClass.StaticMethod();
    

    【讨论】:

      【解决方案2】:

      您可以像使用任何其他公共静态方法一样使用抽象类的公共静态方法。例如:

      Logger.Configure();
      

      您不需要Logger 的实例以这种方式调用Configure。而且您不能在不创建该类型的实例的情况下调用该类型的非静态方法。所以,Logger.NonStaticMethod() 不起作用。

      可以在类重载中调用公共或受保护的静态方法。您不能覆盖它们,因此它们通常用作某种实用方法或 模板 方法的不可覆盖部分:

      public class DerivedClass: AbstractClass
      {
          public DerivedClass(Args args)
              : base(args)
          {
          }
      
          protected override void BuildResponses()
          {
              FormLoad(args);
          }
      }
      

      此外,公共静态方法有时用作工厂方法:

      public abstract class Logger
      {
          public static Logger NLog()
          {
              return new NLogLogger();
          }
      }
      
      ...
      
      var logger = Logger.NLog();
      logger.Log("Message");
      

      您可以在 BCL 中的许多地方看到这种用法的示例:WebRequest.Create(...),例如,创建 HttpWebRequestFtpWebRequest 和其他从 WebRequest 派生的。

      【讨论】:

        猜你喜欢
        • 2011-04-23
        • 2011-07-11
        • 2013-07-21
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 2011-01-27
        • 2011-01-24
        相关资源
        最近更新 更多