非静态方法和抽象类的静态方法有什么区别?

时间:2016-04-20 11:22:42

标签: c# access-modifiers

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

我假设调用这些方法没有区别,因为我们无法为Abstract Class创建实例,因此我们只能使用类名调用静态和非静态方法。

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

例: 摘要类:

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
    }

2 个答案:

答案 0 :(得分:1)

您可以将抽象类的公共静态方法用作任何其他公共静态方法。例如:

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。< / p>

答案 1 :(得分:1)

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

  

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

在抽象类中同时使用静态和非静态方法是合法的,是的,您认为在Abstract类中使用静态方法不是最佳实践。当我概念化abstract类时,它应该是无形的,简单的抽象,如Shape。只有当某个类继承了一个抽象类时,它才能在像Circle或square这样的现实世界中获得生命和意义。所以是的,你可以使用静态和非静态方法,就像使用任何其他类一样,它对抽象类没有多大意义。

  

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

你可以照常在类的实例上调用非静态方法,是的,你是对的 我们不能为抽象类创建对象,静态方法将直接使用这样的类名调用,并且在编译器执行语句时很快就会调用它。

MyAbstractClass.StaticMethod();