我知道在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
}
答案 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(...)
,例如,创建HttpWebRequest
,FtpWebRequest
以及其他来自WebRequest
。< / p>
答案 1 :(得分:1)
让我试着回答你的两个问题 -
我知道在Abstract中使用Static方法不是最佳做法 类,但有什么区别如果我同时使用静态和非静态 抽象类中的方法
在抽象类中同时使用静态和非静态方法是合法的,是的,您认为在Abstract类中使用静态方法不是最佳实践。当我概念化abstract
类时,它应该是无形的,简单的抽象,如Shape。只有当某个类继承了一个抽象类时,它才能在像Circle或square这样的现实世界中获得生命和意义。所以是的,你可以使用静态和非静态方法,就像使用任何其他类一样,它对抽象类没有多大意义。
调用这些方法有什么不同吗?当静态方法 将调用一个抽象,因为我们无法为一个创建对象 抽象类。
你可以照常在类的实例上调用非静态方法,是的,你是对的 我们不能为抽象类创建对象,静态方法将直接使用这样的类名调用,并且在编译器执行语句时很快就会调用它。
MyAbstractClass.StaticMethod();