2010-08-10 2 views

Antwort

6

Ein mögliches Design, das einen privaten Konstruktor auf eine abstrakte Klasse verwenden würde:

public abstract class BaseClass 
{ 
    private BaseClass(Object param) 
    { 
     //Do something with parameters 
    } 

    //Provide various methods that descendant classes will know how to perform 

    public static BaseClass FromObject(Object value) 
    { 
     //Based on object, choose which type of derived class to construct... 
    } 

    private class HiddenDerivedA : BaseClass 
    { 
     public HiddenDerivedA(Object value) 
      : base(value) 
     { 
     } 
    } 

    private class HiddenDerivedB : BaseClass 
    { 
     public HiddenDerivedB(Object value) 
      : base(value) 
     { 
     } 
    } 
} 

Dieses Muster ist nützlich, wenn die abgeleiteten Implementierungen fest an die Auswahllogik gekoppelt sind, verwendet, um sie zu konstruieren und Sie möchten einen hohen Grad an Isolation von dem Rest Ihres Codes bieten. Es entbindet Sie von der Verantwortung, andere als die von Ihnen ausdrücklich beabsichtigten Erben zu unterstützen, und ermöglicht Ihnen, alle privaten Zustände aus der Basisklasse für Ihre abgeleiteten Klassen verfügbar zu machen.

3
  1. Sehr wenig. Der öffentliche Konstruktor kann nur als geschützter Benutzer verwendet werden.

  2. Ja, es kann mit dem Schlüsselwort this von anderen (geschützten/öffentlichen) Konstruktoren aufgerufen werden ('seitwärts').

+0

In 2: Sie meinen das Schlüsselwort "this". "base" gehört zu abgeleiteten Klassen und kann keine privaten Schlüssel aufrufen. –

+0

@John: Ja, thx. Wird bearbeiten. –

+0

@John, "base" kann private Konstruktoren aufrufen, wenn der Ableitungstyp eine geschachtelte Klasse des abgeleiteten Typs ist. –

3

Frage # 1: Nicht viel. Sie können den Konstruktor einer abstrakten Klasse nicht direkt aufrufen (instanziieren). Sie konnten nur einen aus einer Unterklasse aufrufen, was bedeutet, dass Sie zu diesem Zeitpunkt definitiv Zugang zu geschützten Mitgliedern sowie öffentlichen Mitgliedern haben.

Frage # 2: Nein, nicht viel Sinn. Ein privater Konstruktor für eine abstrakte Klasse konnte nur durch "Konstruktorverkettung" von einem nichtprivaten Konstruktor derselben Klasse aufgerufen werden.

+0

# 2 kann nützlich sein. –

+0

@Henk Holterman - Ich konnte es sehen. Wird es nicht ausschließen! –

+2

# 2 - oder ein Konstruktor aus einem verschachtelten Typ, wie Dan Antwort. –

-1

Es scheint nicht viel Unterschied zu mir, die folgenden Code-Ausgänge

Foo
Bar

public abstract class Foo 
{ 
    protected Foo() { 
     Console.WriteLine ("Foo"); 
    } 
} 

public class Bar : Foo 
{ 
    public Bar() { 
     Console.WriteLine ("Bar"); 
    } 
} 

void Main() 
{ 
    new Bar(); 
} 

Eine abstrakte Konstruktor kann nicht außer Kraft gesetzt werden, wenn sie geschützt ist. Nicht sicher, ob ich Ihre Frage beantwortet :-)

+1

Es gibt keinen "abstrakten Konstruktor" und Sie können Konstruktoren sowieso nicht überschreiben. –

+0

Das mag so sein, aber wenn Sie den Code oben versuchen, werden Sie sehen, dass ich einen Konstruktor in einer abstrakten Klasse habe, der tatsächlich ausgeführt wird, wenn eine Klasse, die daraus abgeleitet wird, erstellt wird. –

0

Um meine ersten Fragen zu klären, werde ich noch einmal antworten (ohne Kommentar). Also, ich weiß, dass es nicht möglich ist, abstrakte Klasse direkt instansite. Nur wenn eine Klasse von der Abstarct-Klasse abstammt, kann sie instanziiert werden. Ich weiß, dass eine Klasse einen Konstruktor wie privat, öffentlich, intern und auch geschützt haben kann. Was geschützt bedeutet, weiß ich.

Aber was ist der Unterschied zwischen einem öffentlichen und einem geschützten Konstruktor in einer abstrakten Klasse. Ich kann den Unterschied zwischen zweien nicht sehen.

Verwandte Themen