c# ArrayList Pointer ?

MasterMerlin

Grünschnabel
Hi ho und hallo.
Als neues Mitglied gleich mal eine Frage.
Ich habe folgendes Problem.

Ich habe die Klassen a, b und c. Nun will aich , das a - b initialisiert. Anschliessend muss ich aber von c aus auf den inhalt einer ArrayList in b zugreifen können. Über pointer scheints ja in c# wegen managed unmanaged nicht zu gehen (oder ich blicks noch nicht).

class a : object
{
bclass b = new bclass();
cclass c = new cclass();
}

class bclass: object
{
ArrayList test;
bclass()
{
test = new ArrayList();
}
}


class cclass : object
{
Blubber ...
Hier zugriff auf ArrayList aus bclass ?
}

Danke im Voraus für alle Antworten.
 
3 Ansäze:

a) Referenz auf b public zugriffsmethode

b) Statisches Feld

Mein Beispiele sind in Java, kannst du aber auf C# anpassen

a)

Code:
public class BClass {
   private ArrayList list;
   public ArrayList getList() {
      return list;
   }
}
public class AClass {
   private BClass bclass;
   public AClass(BClass bclass) {
        this.bclass = bclass;
        ArrayList willIchHaben = bclass.getList();
   }
}

b)

Code:
public class BClass {
  public static ArrayList list;
  public BClass() {
      BClass.list = new ArrayList();
  }
}
public class AClass {
  public AClass {
      ArrayList willIchHaben = BClass.list;
}


Gibt noch mehr möglichkeiten, z.b Singleton Pattern, Innerclass (Containment) und ähnlichem, aber dazu müsste mann deine Anforderrungen kennen.
 
Danke, aber das brachte mich leider nicht weiter.

Die Klasse B ist public. Sie wird ja in A schon aufgerufen, also kann ich sie in C nicht nochmal aufrufen, da ich ja sonst durch den Constructor die werte innerhalb der ArrayList verliere.
 
Original geschrieben von MasterMerlin
Danke, aber das brachte mich leider nicht weiter.

Die Klasse B ist public. Sie wird ja in A schon aufgerufen, also kann ich sie in C nicht nochmal aufrufen, da ich ja sonst durch den Constructor die werte innerhalb der ArrayList verliere.

Schau dir den Code nochmal an.
Dann wirst du erkennen das du sehr wohl die richtigen Werte bekommst.

Was spricht dagegen CClass eine Referenz auf dein b Object zu übergeben?

richtig nichts ;)
 
Hallo.

Kurz zu deinen Klassen etwas, du musst sie nicht von object ableiten, wenn nichts anderes angegeben ist, geschieht dies sowieso. Alles leitet sich ursprünglich von object ab.

Wegen den Klassen in in deinem Beispiel.

Chris hat dir schon gezeigt, wie du den Konstruktor einer Klasse abändern kannst, das du auf die eine Methode der Instanz der Klasse, welche die neue Klasse erstellt hat, zugreifen kannst.

Code:
using System;

public class A
{

	public static void Main(string[] args)
	{
		new A();
	}

	B myB;
	C myC;

	public A()
	{
		B = new B(this);
		C = new C(this);
		
		B.DoSomething();
		C.DoSomething(),
	}

	public B GetB()
	{
		return myB;
	}

	public C GetC()
	{
		return myC;
	}
}

public class B
{
	A parentA;

	public B(A a)
	{
		parentA = a;
	}

	public void DoSomething()
	{
		Console.WriteLine(parentA.GetC().StringOfC);
	}

	public string StringOfB = "Hi there, I'm B! ;)";
}


public class C
{
	A parentA;

	public C(A a)
	{
		parentA = a;
	}
	
	public void DoSomething()
	{
		Console.WriteLine(parentA.GetB().StringOfB);
	}
	public string StringOfC = "Hi there, I'm C! ;)";
}

So könnte dein Beispiel aussehen. Nur hab ich mal bei mir Strings genommen, das schnell was ausgegeben werden kann.
Das Beispiel ist (sollte ;) ) lauffähig sein, so wie es ist. Wenn du es also Ausprobieren willst, nur zu.

Die Ausgabe sollte sein.

Hi there, I'm C! ;)
Hi there, I'm B! ;)

Da du in den Konstruktoren Objekte übergibst, hast du in den neuen Objekten immer eine referenz auf dieses eine Objekt, und nicht auf eine neue Instanz davon.
Die Objekte sind im Speicher immer nur einmal vorhanden, und auf dieses eine wird immer gezeigt. (Ausser es wird halt ein ganz neues Instanziert, aber bei der Übergabe in Methoden ist es so.)



Mfg,
Alex
 
Danke nochmal für Eure Antworten, ich hatte leider eine Kleinigkeit übersehen, daher lief es nicht. Schade allerdings, das man nicht einfach Pointer auf Klassen setzen kann ;)
 
Diese Übergabe in den Methoden (und der Konstruktor ansich ist auch eine Methode, eine spezielle halt), ist im Prinzip ein "Pointer". Es wird auf die Instanz im Speicher gezeigt, und keine neue Instanz erstellt, oder die vorhandene Instanz kopiert.

Wenn du es deutlischer haben willst, benutze das Keyword ref - Referenz bei deinen Methoden.
Referenz - Hinweis - to refer - hinweisen, verweisen,...

Code:
public void Blubb(ref Type obj)
{
...
}

Type t = new Type(..);
Blubb(ref t);
 

Neue Beiträge

Zurück