2017-11-28 2 views
-1

Ich habe eine Klasse, wie untenWie die Basis abgeleitete Klasse entwerfen, wenn es eine statische Eigenschaft in der Basis ist, und dass muss versteckt werden

public class SomeClass 
{ 
    public static int someValue; 

    public void Some_Logic_That_Uses_somevalue() 
    { 
     // Complex large method using 'someValue' 
    } 
} 

nun zwei abgeleiteten Klassen brauche ich. ClassA:SomeClass und ClassB:SomeClass.

Für beide abgeleiteten Klassen bleibt Some_Logic_That_Uses_somevalue() die Logik gleich. Aber ClassA wird seinen 'someValue' haben und ClassB wird seinen eigenen anderen Wert haben und sie sind statisch.

Wie kann ich die Klassen entwerfen?

+0

Muss der Wert * aus irgendeinem Grund statisch sein? Oder nehmen Sie einfach an, dass es sollte? Abgesehen davon sollten Sie kein Feld öffentlich zugänglich machen, stattdessen können Sie eine öffentliche Eigenschaft verwenden. – HimBromBeere

+0

Dieser Code ist bereits da und ich möchte so wenig wie möglich Änderungen vornehmen. Es ist ein öffentlicher statischer Wert – swifty

+0

Wenn 'someValue' ein öffentlicher statischer Wert ist und Sie' Some_Logic_That_Uses_somevalue' nicht ändern können, gibt es nichts, was Sie sehen können, soweit ich das sehen kann. –

Antwort

0

Vorlage anwenden Methode Muster Some_Logic_That_Uses_somevalue. Dazu erstellen Sie die virtuelle Eigenschaft someValueProp in SomeClass und verwenden Sie someValue als Hintergrundfeld dafür. Überschreiben Sie dann diese Eigenschaft in ClassB, um ein anderes Hintergrundfeld zu verwenden.

public class SomeClass 
{ 
    public static int someValue; 

    public virtual int someValueProp 
    { 
     get { return someValue; } 
     set { someValue = value; } 
    } 

    public void Some_Logic_That_Uses_somevalue() 
    { 
     // Complex large method using 'someValueProp' 
    } 
} 

public class ClassB : SomeClass 
{ 
    public static int anotherValue; 

    public override int someValueProp 
    { 
     get { return anotherValue; } 
     set { anotherValue = value; } 
    } 
} 
+0

Der Wert sollte immer noch als someValue in der abgeleiteten Klasse benannt werden, kein anderer Wert – swifty

+1

Wenn Sie möchten, dass der abgeleitete KlasseB im statischen Feld einen anderen Wert hat, ist das nicht möglich. Sie können "someValue" und "anotherValue" aus dem Client-Code ausblenden und "someValueProp" verwenden, wo Sie "someValue" verwenden möchten. – casperbear

-1

Ich denke, der einfachste Weg wäre, eine virtuelle Methode zu implementieren, die den statischen Wert abruft. Rufen Sie diese Methode von Some_Logic_That_Uses_somevalue() auf und überschreiben Sie sie in Unterklassen, um ihre statischen Werte abzurufen.

public class SomeClass 
{ 
    public static int someValue; 

    public virtual int GetValue() => someValue; 

    public Some_Logic_That_Uses_somevalue() 
    { 
     // Complex large method getting 'someValue' through GetValue() 
    } 
} 

public class ClassA : SomeClass 
{ 
    public static int someValueForA; 

    public override int GetValue() => someValueForA; 
} 

public class ClassB : SomeClass 
{ 
    public static int someValueForB; 

    public override int GetValue() => someValueForB; 
} 

}

+0

Können Sie den Entwurf zeigen, bitte sowohl abgeleitete als auch Basisklassen – swifty

Verwandte Themen