2016-04-20 9 views
4

Ich weiß, es ist keine beste Praxis, statische Methode in der abstrakten Klasse zu verwenden, aber was ist der Unterschied, wenn ich statische und nicht statische Methode in abstrakter Klasse verwende.Was ist der Unterschied zwischen der nicht statischen Methode und der statischen Methode einer abstrakten Klasse?

Ich nehme an, es gibt keinen Unterschied beim Aufruf dieser Methoden, weil wir keine Instanz für abstrakte Klasse erstellen können, so dass wir sowohl statische als auch nicht-statische Methode nur mit Klassennamen aufrufen können.

Gibt es außer dem Stichwort 'Static' noch einen anderen Unterschied?

Ex: Abstrakte Klasse:

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 

} 

Abgeleitete Klasse:

public class DerivedClass : AbstractClass 
    { 
    #region Public Constructors 

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

    #endregion 

    #region Protected Methods 

    protected override void Responses() 
    { 
     //logic 
    } 

    #endregion 
    } 

Antwort

1

Sie können öffentliche statische Methode einer abstrakten Klasse wie jede andere öffentliche statische Methode verwenden. Zum Beispiel:

Logger.Configure(); 

Sie müssen keine Instanz von LoggerConfigure auf diese Weise nennen. Und Sie können nicht nicht-statische Methoden des Typs aufrufen, ohne Instanz dieses Typs zu erstellen. Also, Logger.NonStaticMethod() wird nicht funktionieren.

Öffentliche oder geschützte statische Methoden können innerhalb der Klassenüberlastung aufgerufen werden. Sie können nicht außer Kraft setzen sie, so dass sie in der Regel als eine Art von Hilfsmethoden oder als nicht-überschreibbaren Teil Vorlage Methode verwendet:

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

    protected override void BuildResponses() 
    { 
     FormLoad(args); 
    } 
} 

Auch öffentliche statische Methoden manchmal verwendet als Fabrikmethoden:

public abstract class Logger 
{ 
    public static Logger NLog() 
    { 
     return new NLogLogger(); 
    } 
} 

... 

var logger = Logger.NLog(); 
logger.Log("Message"); 

Sie können Beispiel für eine solche Nutzung in vielen Orten innerhalb BCL sehen: WebRequest.Create(...) zum Beispiel schafft HttpWebRequest, FtpWebRequest und andere, die aus WebRequest ableiten.

1

Lassen Sie mich versuchen, die beide Ihre Fragen zu beantworten -

Ich weiß, dass es nicht eine bewährte Methode ist statische Methode in der abstrakten Klasse zu verwenden, aber was ist der Unterschied, wenn ich sowohl statische als auch nicht statisch verwenden Methode in der abstrakten Klasse

es ist legitim sowohl statische als auch nicht-statische Methoden in der abstrakten Klasse zu haben, und ja, Sie haben Recht in Ihrem Glauben, dass es nicht eine bewährte Methode statische Methode in der abstrakten Klasse zu verwenden . Wenn ich eine abstract Klasse konzeptioniere, sollte es immateriell sein, einfach abstrakt, wie Shape. Nur wenn eine Klasse eine abstrakte Klasse erbt, erhält sie Leben und macht Sinn in der realen Welt wie Kreis oder Quadrat. Also ja, Sie können statische und nicht-statische Methoden wie bei jeder anderen Klasse verwenden, es würde bei abstrakten Klassen wenig Sinn machen.

Gibt es einen Unterschied beim Aufruf dieser Methoden? Wenn die statische Methode eines Abstracts aufgerufen wird, können wir kein Objekt für eine Abstraktionsklasse erstellen.

Sie können auf der Instanz der Klasse, wie üblich, eine nicht-statische Methode aufrufen, und ja, Sie haben Recht, dass wir Objekt für eine abstrakte Klasse nicht erstellen können, werden statische Methode direkt mit Klassennamen aufgerufen werden so, und es aufgerufen, sobald der Compiler die Anweisung ausführt.

MyAbstractClass.StaticMethod();