2016-04-20 3 views
4

Я знаю, что использовать статический метод в абстрактном классе нецелесообразно, но какая разница Если я использую как статический, так и нестационарный метод в абстрактном классе.В чем разница между нестатическим методом и статическим методом абстрактного класса?

Я предполагаю, что нет никакого различия в вызове этих методов, потому что мы не можем создать экземпляр для абстрактного класса, поэтому мы можем вызвать как статический, так и нестатический метод, используя только имя класса.

Есть ли разница между ними, кроме ключевого слова «Статический»?

Ex: Аннотация Класс:

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 
    } 

ответ

1

Вы можете использовать общественный статический метод абстрактного класса, как и любой другой общественный статический метод. Например:

Logger.Configure(); 

Вам не нужно экземпляр Logger называть Configure таким образом. И вы не можете вызывать нестатические методы типа без создания экземпляра этого типа. Таким образом, Logger.NonStaticMethod() не будет работать.

Публичные или защищенные статические методы могут быть вызваны в рамках перегрузки класса. Вы не можете переопределить их, чтобы они, как правило, используются в качестве своего рода вспомогательных методов или как не Overridable части шаблона метод:

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.

1

Позвольте мне ответить на оба ваши вопросы -

Я знаю, что это не рекомендуется использовать статический метод в абстрактном классе, но в чем разница Если я использую как статические, так и нон статическую метода в абстрактном классе

законно иметь как статические, так и не-статические методы в вашем абстрактном классе и да, вы правы в своих убеждениях, что это не рекомендуется использовать статический метод в абстрактном классе , Когда я осмысливаю класс abstract, он должен быть неосязаемым, просто абстрактным, например, Shape. Только когда какой-то класс наследует абстрактный класс, он приобретает жизнь и имеет смысл в реальном мире, таком как Circle или square. Итак, да, вы можете использовать статические и нестатические методы, как и для любого другого класса, это не имеет смысла в абстрактных классах.

Есть ли разница в вызове этих методов? Когда статический метод абстрактного будет вызываться, поскольку мы не можем создать объект для абстрактного класса .

Вы можете назвать не-статический метод экземпляра класса, как обычно, и да, вы правы, что мы не можем создать объект для абстрактного класса, статический метод будет вызываться непосредственно с именем класса вроде этого, и он вызвал, как только в компиляторе выполняется оператор.

MyAbstractClass.StaticMethod(); 
Смежные вопросы