Laden...

Schnittstelle, Interface und Instanz eines Objekts

Erstellt von m.grauber vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.686 Views
Thema geschlossen
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren
Schnittstelle, Interface und Instanz eines Objekts

Hallo,

In einem Interface "Mein_Interface" ist definiert:


public string Obj { get; set; }

Dieses Interface wird mit einer Form verwendet:


public partial class Mein_Fenster : Mein_Interface

ich sage nun im Load des Forms:


Mein_Fenster.Mein_Interface.Obj = new Obj();
Mein_Fenster.Mein_Interface.Obj = Erstelle_Mein_Obj();

**
Wie kann ich im Interface die Instanz erzeugen, damit ich mir die oberste Zeile im Load des Forms sparen kann: Mein_Fenster.Mein_Interface.Obj = new Obj();**

(Jedes einzelne Fenster soll mit einer unterschiedlichen Instanz von Obj arbeiten, also je Fenster unterschiedliche Werte enthalten, die sich nicht gegenseitig beeinflussen.

Es handelt sich in Wirklichkeit nicht um einen string, sondern ein komplexeres Objekt (Referenztyp!), welches scheinbar durch das nachfolgend geöffnete Fenster überschrieben wird, wenn die derzeit oberste Zeile im Load fehlt.)

Einfach in den Konstruktor des Interfaces hineinschreiben wird ignoriert (das Interface ist ja nur der Bauplan). Das Init-des Interfaces zu abonnieren, wird leider auch ignoriert.

Es muss auch weiterhin ein Interface bleiben.

Besten Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

2.298 Beiträge seit 2010
vor 11 Jahren

Hallo,

In dem von dir gezeigten Code:


Mein_Fenster.Mein_Interface.Obj = new Obj();
Mein_Fenster.Mein_Interface.Obj = Erstelle_Mein_Obj();

Ist die erste Zeile doch eigentlich nicht notwendig. Denn du weist dem Objekt eine neue Instanz zu und überschreibst sie direkt wieder.

Eine Instanziierung in Interfaces ist nicht möglich, ein Ausweg wäre maximal eine Basisklasse, die die Initialisierung durchführt.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Hallo Inflames!

Danke sehr für die schnelle Rückmeldung!

Ich habe es noch ergänzt.

Da das Interface in mehreren Forms verwendet wird, "haftet" scheinbar durch die letzte Zuweisung noch mein Objekt der zuletzt geöffneten Form drin und wird scheinbar überschrieben, da ich ja direkt einen neuen Wert mit = zuweise.

Mit der obersten Zeile wird das definitiv verhindert. Nur möchte ich diese Zeile nicht bei jedem öffnen des Fensters schreiben.

Ich habe es inzwischen mit einem einfacheren String Objekt getestet. Dort beeinflusst es sich nicht gegenseitig.

Ich benötige irgendwie eine Instanz.

**
Oder kann ich das Objekt Obj evtl. direkt im eigenen Objekt-Konstruktor von Obj instanziieren?**

Besten Dank

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

C
258 Beiträge seit 2011
vor 11 Jahren

Dein Interface sollte auch als interface definiert sein. wenn du es richtig gemcht hättest wäre es nicht möglich die Property als public zu definieren (da interface member immer public sind und der compiler das public nicht akzeptiert).

wenn ich das ganze nachbau mit simplen klassen, funktioniert es so wie es sollte.

       public interface ITest
    {
        ComplexClass ComplexClass { get; set; }
    }

    public class ComplexClass
    {
        public int Id { get; set; }
    }

    public class Form2 : Form, ITest
    {
        public ComplexClass ComplexClass { get; set; }
    }

    public class Form3 : Form, ITest
    {
        public ComplexClass ComplexClass { get; set; }
    }
49.485 Beiträge seit 2005
vor 11 Jahren

Hallo m.grauber,

wie inflames2k schon gesagt hat, ist die Zuweisung überflüssig, wenn direkt danach eine Zuweisung erfolgt, die das Ergebnis der ersten überschreibt.

Ansonsten ist es doch eine Binsenweisheit, dass man ein Objekt (mit new) erzeugen muss, wenn man ein neues braucht. Das kannst du nicht vermeiden. Du kannst natürlich im Konstruktor des Forms die Property initialisieren.

Ich habe den Eindruck, dass wir hier über Dinge sprechen, die unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 fallen.

herbivore

16.807 Beiträge seit 2008
vor 11 Jahren

Grundlagen:

Ein Interface stellt einen Rahmen. Die vorgegebenen Methoden müssen in jeder Klasse, die das Interface implementiert, umgesetzt werden (Sinnvolles Beispiel: Factory Pattern und die Work-Methode oder IDisposable und die Dispose-Methode).
Eine direkte, logische Implementierung findet niemals in einem Interface statt - gar nicht möglich.

Eine abstrakte Basis-Klasse stellt Methoden zur Verfügung, die von jeder Klasse, die davon erbt, 1:1 so übernommen werden, OHNE dessen Inhalt neu zu schreiben. Es kann kein Instanz der Basis-Klasse erstellt werden, da abstrakt.

Beachte [Hinweis] Wie poste ich richtig? 1.1.1

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Vielen Dank für die Hilfe!

Ich muss mich leider korrigieren und etwas ausholen:

Im Moment greife ich auf die Member aus dem Interface so zu:


public interface IMein_Interface
{
  Meine_Klasse meine_Klasse { get; set; }
}

public class Meine_Klasse
{
	public string Obj { get; set; }
}

(In Meine_Klasse befinden sich noch weitere Member.)

In der Form wird das Interface mit :IMeine_Klasse verwendet und mit...


public Meine_Klasse {get;set;}

...verwendet. Es wird also schon doch korrekt implementiert. Ich bin nur durch die "Unterklasse" durcheinander gekommen.

Dadurch erhöht sich die Übersichtlichkeit und ich kann mehrere Member in verschiedene "Bereiche" (d.h. Interfaces) gliedern, statt das dann auf alles nur mit this.Obj bzw. this.Obj2 zugegriffen wird.

==> Wie verhält es sich nun mit diesen "Unter-Membern" also z.B. Obj? Muss ich in der Form nun nicht nur das Interface definieren, sondern auch noch das Obj aus der Klasse des Interfaces?


Meine_Klasse.Obj=new Meine_Klasse();

Das mache ich bisher nur dann wenn ich diese mit abweichenden Werten benötige, was eine Menge Arbeit spart. Besonders, wenn ich neue Member benötige muss nichts nachgetragen werden.

Das Problem ist nun im Ansatz klar: Im Interface verweise ich auf eine Klasse, die ich aber nicht instanziiere. Wie kann ich das trotzdem nutzen? Und wurden meine Probleme dadurch verursacht?

Besten Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

D
96 Beiträge seit 2012
vor 11 Jahren

Kann es sein, dass die Methode

Erstelle_Mein_Obj()

auf

 Mein_Fenster.Mein_Interface.Obj

zugreift und die bestehende Instanz ändert und dann zurückgibt?

Vielleicht solltest du den Inhalt dieser Methode mal posten.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Hallo kleiner Tomy,

Auch Dir lieben Dank! Leider nicht. Dort wird schon richtig Instanziiert:


Objekt oob = new Objekt();
return oob

aber sobald es aus der Methode raus geht, sage ich folgendes:


Mein_Fenster.Mein_Interface.Obj = Erstelle_Mein_Obj();

An dieser Stelle vermute ich das Problem.

Da es Mein_Fenster.Mein_Interface.Obj ja einfach zugewiesen wird, statt eine neue Instanz zuzuweisen. Ich vermute daher, dass irgentetwas durch die Schnittstelle anders läuft und durch die Schnittstelle evtl. irgend ein "vorheriger" Wert (der in einem ganz anderen Fenster gesetzt wird) überschrieben wird.

Aber wenn das bei Schnittstellen nicht passieren kann; mit was ich eigentlich rechne, dann teilt es mir bitte mit. Es muss dann noch etwas anderes sein.

Bin noch immer nicht weiter damit.

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo m.grauber,

da geht noch einiges durcheinander. Natürlich muss man ein Objekt erst erstellen, bevor man es benutzen kann. Die Property wird im Interface deklariert, aber sie muss von jeder Klasse, die das Interface implementiert, implementiert werden. Natürlich könnte man sie z.B. so implementieren:

private MyObj _obj;

public MyObj Obj { 
   get {
      if (_obj == null) {
         _obj = new Obj ();
      }
      return _obj;
   }
   set { _obj = value; }
}

Oder noch einfacher kann man an Obj im Konstruktor der Klasse, die das Interface implementiert, new MyObj () zuweisen.

Oder man weist der Property vor der Benutzung eben von außen ein neues Objekt zu.

Was man auch immer macht, das fällt alles [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore

Thema geschlossen