Laden...

Klassendesign: Interface, Container, Wrapper

Erstellt von Xqgene vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.413 Views
X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 14 Jahren
Klassendesign: Interface, Container, Wrapper

Hallo,

irgendwie stehe ich auf dem Schlauch.

Also es gibt folgendes Konzept: Interface


interface ISample
{
  int State { get; } 
}

und eine Wrapper-Klasse, welche dieses Interface implementiert.


class SampleWrapper : ISample
{
  public SampleWrapper(ISample managedObj) { ... }
  public int State { get { return managedObj.State; } }
}

Die Anwendung bekommt Daten (ISample) von einer externen Datenquelle. Die Wrapper-Klasse gewährleistet gleiche Logik für die Datenverarbeitung der ISample-Objekte, unabhängig davon, wie die Klasse intern aufgebaut ist. alle Objekte der Anwendung greifen also auf ISample-Objekte indirekt über SampleWrapper

nun zu meinem Problem, alle Klassen/Objekte die auf ein ISample-Objekt zugreifen dürfen die State-Eigenschaft nicht beschreiben. Alle außer der Wrapper-Klasse selbst.

thja... Ideen, wie ich das am elegantesten löse?

5.742 Beiträge seit 2007
vor 14 Jahren

Hallo Xqgene,

nimm doch einfach ein weiteres Interface:


internal interface IWritableSample
   : ISample
{
  new int State { get; set; }
}

class SampleWrapper : ISample
{
  public SampleWrapper(IWritableSample managedObj) { ... }
  public int State { get { return managedObj.State; } }
}

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Xqgene,

wobei du durch ein Interface nur erzwingen kannst, dass die Klasse etwas implementiert. Du kannst mit einem Interface nicht verhindern, dass zusätzlich etwas implementiert wird. Selbst wenn du im Interface nur get zu stehen hast, kann die Klasse trotzdem zusätzlich set implementieren.

herbivore

699 Beiträge seit 2007
vor 14 Jahren

Hallo herbivore,

Selbst wenn du im Interface nur get zu stehen hast, kann die Klasse trotzdem zusätzlich set implementieren.

Grüße Stephan

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Stipo,

wenn man in der abstrakten Klasse eine abstrakte Property hat, muss man diese in der Unterklasse überschreiben. Da man aber override nur für die ganze Property angeben und nicht einzeln für Getter oder Setter kann, würde der Compiler meckern, wenn in der Unterklasse auch ein set angegeben wird, für das in der abstrakten Klasse keine Deklaration vorhanden ist, die überschrieben werden kann. Das ist aber nur ein rein technischer Grund, der das bei C# in dem speziellen Fall verhindert. Im allgemeinen gilt auch bei abstrakten Oberklassen, dass die Unterklasse beliebig erweitert werden kann.

Wenn die Unterklasse der abstrakten Klasse sich eines extra Interfaces für den Setter bedienen würde, könnte man den Setter interface-explizit definieren. Auf die Art würde die Unterklasse doch noch zu ihrem Setter kommen, selbst wenn dieser dann nur über das Interface anzusprechen ist.

herbivore

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 14 Jahren

wobei du durch ein Interface nur erzwingen kannst, dass die Klasse etwas implementiert. Du kannst mit einem Interface nicht verhindern, dass zusätzlich etwas implementiert wird. Selbst wenn du im Interface nur get zu stehen hast, kann die Klasse trotzdem zusätzlich set implementieren.

das ist mir natürlich bewusst.

@winSharp93: über ein weiteres interface habe ich auch nachgedacht. mal sehen...

T
381 Beiträge seit 2009
vor 14 Jahren

Dann kann dein Interface doch Get anbieten und die implementierende Klasse private set hinzufügen.