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

4

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

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

除了关键字“Static”之外,它们之间是否还有其他区别?

例如:

抽象类:

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个回答

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的对象。

1
让我试着回答你的两个问题 -
使用静态方法在抽象类中不是最佳实践,但如果我在抽象类中同时使用静态和非静态方法有什么区别?
在您的抽象类中同时拥有静态和非静态方法是合法的。是的,您的信念是正确的,在抽象类中使用静态方法不是最佳实践。当我构思一个抽象类时,它应该是无形的,简单地抽象,就像形状一样。只有当某个类继承了抽象类,它才会在现实世界中具有生命和意义,比如圆形或正方形。因此,您可以像任何其他类一样使用静态和非静态方法,但对于抽象类来说这没有太多意义。
调用这些方法有什么区别吗?由于我们不能为抽象类创建对象,所以抽象类的静态方法何时被调用?
您可以像平常一样在类的实例上调用非静态方法,而且是的,您是正确的,我们不能为抽象类创建对象,静态方法将直接通过类名调用,就像这样,并且在编译器执行语句时立即调用。
MyAbstractClass.StaticMethod();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接