2008-10-20 7 views
10

Wenn ich eine Eigenschaft habe, die ich Erben schreiben lassen möchte, aber nur extern lesen, was ist der bevorzugte Weg, dies zu implementieren? Ich gehe normalerweise mit so etwas:Was ist der beste Weg, um eine Eigenschaft zu implementieren, die readonly für die Öffentlichkeit, aber für Erben schreibbar ist?

private object m_myProp; 
public object MyProp 
{ 
    get { return m_myProp; } 
} 
protected void SetMyProp(object value) 
{ 
    m_myProp = value; 
} 

Gibt es einen besseren Weg?

Antwort

36
private object m_myProp; 
public object MyProp 
{ 
    get { return m_myProp; } 
    protected set { m_myProp = value; } 
} 

oder in C# 3,0

public object MyProp {get; protected set;} 
+0

Das 'protected' Feld wird sich als überlegen erweisen, wenn es nötig ist, irgendwelche' Interlocked' Methoden zu verwenden. Ich finde es merkwürdig, dass C# Ereignisdelegaten mit dem gleichen Namen wie die Ereignisse aufdeckt, aber keine Autoeigenschaften-Sicherungsvariablen überhaupt aufdeckt. – supercat

0

einen Setter und Getter zu haben, ist nicht wirklich besser als auf dieser Ebene der Sichtbarkeit eine Variable aufweist.

Daher könnten Sie einfach die Variable selbst geschützt und den Leser öffentlich machen.

Das gesagt, Setter und Getter sind ein Indikator für schlechte OO - Sind Sie sicher, dass Sie sie brauchen? Sie sollten das Objekt bitten, etwas mit seinen Mitgliedern zu tun, es nicht nach seinen Mitgliedern zu fragen und sie dann außerhalb des Objekts zu manipulieren.

Dies ist eine sehr allgemeine Regel und es gibt viele Ausnahmen.

+2

Unsinn; Ein Getter/Setter ist * signifikant * besser als ein geschütztes Feld. Getters/Setter sind * nicht * ein Indikator für schlechtes OO: Sie zeigen Verkapselung und erlauben Polymorphismus (via virtuell) - wie wollen Sie OO? –

+0

Sie stellen immer noch die Implementierung Ihrer Klasse offen und sind ein Hinweis darauf, dass Sie Daten erhalten, anstatt eine Klasse zu bitten, eine Operation für Sie durchzuführen. Das ist nicht OO, es ist eine Fälschung, die prozedurale Programmierer benutzen, bevor sie OO bekommen. –

+0

Hier ist ein guter Artikel darüber, wenn Sie interessiert sind: http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html –

5

Dies ist definitiv der Weg zu gehen.

public object MyProp {get; protected set;} 

Wenn Sie eine ältere Version von C# verwenden, dann ist dies der richtige Weg.

private object _myProp; 
public object MyProp 
{ 
    get { return _myProp; } 
    protected set { _myProp = value; } 
} 
+4

Und wenn Sie auf einer sehr alten Version von C# sind, müssen Sie eine separate haben geschützte Set-Methode :( –

Verwandte Themen