Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Konstruktor in der Oberklasse aufrufen
Paratrooper
myCSharp.de - Member

Avatar #avatar-1887.gif


Dabei seit:
Beiträge: 22
Herkunft: LA

Themenstarter:

Konstruktor in der Oberklasse aufrufen

beantworten | zitieren | melden

Hi,

gibt es eine Möglichkeit, den Konstruktor in der Oberklasse aufzurufen?
Ich bin vor 4 Wochen von Java auf C# umgestiegen. Irgendwie kriege ich das nicht hin.

Beispiel Java:
Zitat
public class Punkt
{
private int x, y;

public Punkt() {
x = y = 0;
}
public Punkt( int x, int y ) {
this.x = x;
this.y = y;
}
public Punkt( Punkt p ) {
x = p.x;
y = p.y;
}

public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public void setXY( int x, int y ) {
this.x = x;
this.y = y;
}
public void move( int dx, int dy ) {
x += dx;
y += dy;
}
public void print() {
System.out.println( this );
}
public String toString() {
return "(" + x + "," + y + ")";
}
}
Zitat
public class Kreis extends Punkt
{
private int r;

public Kreis() {
super();
r = 1;
}
public Kreis( int x, int y, int r ) {
super(x,y);
this.r = r;
}
public Kreis( Punkt p, int r ) {
super(p);
this.r = r;
}

public int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
public void print() {
System.out.println(this);
}
public String toString() {
return "[" + super.toString() + "," + r + "]";
}
}

Wie ihr sehen könnt, rufe ich den Konstruktor der Oberklasse mit "super" auf.

In C# hbe ich das so gelöst:
Zitat
public class Kreis : Punkt
{
public int r;

public Kreis()
{
x = y = 0;
r = 1;
}
public Kreis( int x, int y, int r )
{
this.x = x;
this.y = y;
this.r = r;
}
public Kreis( Punkt p, int r )
{
x = p.x;
y = p.y;
this.r = r;
}

public override string ToString()
{
return "[" + base.ToString() + ", " + r + "]";
}

}

Irgendwie vermisse ich die "super"-Funktion.

Und noch eine Frage: Ich erstelle einen ArrayList L. L fülle ich nun mit "Punkten" auf z.B. L.Add( new Punkt(1,1) ) usw.
Console.WriteLine(L) gibt "System.Collections.ArrayList" aus (obwohl die ToString-Methode in "Punkt" implementiert ist).
Java hat mir immer eine saubere Liste auf meinen Bildschirm gezaubert...

Bin für jeden Rat dankbar...
Paratrooper.
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4.644
Herkunft: Leipzig

beantworten | zitieren | melden

Der Ksontruktor muss folgendermaßen aussehen:
public Kreis( int x, int y, int r ) : base(x,y)
{
    this.r = r;
}


Du musst in Deiner Klasse die ToString() Methode überschreiben.
public override string ToString()
{
    return string.Format("({0}, {1})",  x, y);
}
private Nachricht | Beiträge des Benutzers
Paratrooper
myCSharp.de - Member

Avatar #avatar-1887.gif


Dabei seit:
Beiträge: 22
Herkunft: LA

Themenstarter:

beantworten | zitieren | melden

Hi,

danke für die schnelle Antwort.

Die Konstruktor-Sache hat wunderbar geklappt.

ToString funktioniert immer noch nicht.
Die ToString-Methode war überschrieben. Habe nun deinen Code eingegeben. Die Ausgabe aber bleibt gleich ("System.Collections.ArrayList").

Servus...
Paratrooper.
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4.644
Herkunft: Leipzig

beantworten | zitieren | melden

ArrayList l = new ArrayList();
l.Add(new Punkt(12, 10));
l.Add(new Punkt(120, 100));
MessageBox.Show(l.ToString());

Obiger Code ergibt "System.Collections.ArrayList".

Du musst die List mit einem Index durchlaufen.
for(int i = 0; i < l.Count; i++)
    MessageBox.Show(l[i].ToString());
private Nachricht | Beiträge des Benutzers
Paratrooper
myCSharp.de - Member

Avatar #avatar-1887.gif


Dabei seit:
Beiträge: 22
Herkunft: LA

Themenstarter:

beantworten | zitieren | melden

Hi,

mir ist ja klar, daß ich die Liste durchlaufen muß (anders geht es wohl nicht, oder täusche ich mich ein bißchen???).

In Java lief das ganze doch etwas "unkomplizierter" ab.

Vector v = new Vector();
v.add( new Punkt(100,100) );
v.add( new Punkt(4,3) );
v.add( new Punkt(-2,1) );

System.out.println( v ) hat dann folgendes ausgegeben: [ (100,100); (4,3); (-2,1) ]

Ich mußte die Liste nicht durchlaufen. Es hat schon gereicht, wenn man im Object die toString-Methode implementiert hat.

Servus...
Paratrooper.
private Nachricht | Beiträge des Benutzers
Noodles
myCSharp.de - Experte



Dabei seit:
Beiträge: 4.644
Herkunft: Leipzig

beantworten | zitieren | melden

Nein, so einfach geht das nicht.
Du kannst Dir aber eine eigene PointCollection implementieren und in dieser Klasse dann eine ToString() Methode mit dieser Funktionalität implementieren.

Bsp.:
public class PointCollection : CollectionBase
{
	public void Add(Punkt p)
	{
		base.InnerList.Add(p);
	}
	
        public override string ToString()
	{
		string s = "[ ";
		foreach(Punkt p in base.InnerList)
		{
			s += p.ToString() + "; " + " ";
		}
		s += "]";
		return s;
	}
}
private Nachricht | Beiträge des Benutzers
Paratrooper
myCSharp.de - Member

Avatar #avatar-1887.gif


Dabei seit:
Beiträge: 22
Herkunft: LA

Themenstarter:

beantworten | zitieren | melden

Zitat
Nein, so einfach geht das nicht.

Hihihi, in Java geht es aber...

Was solls...

Ich weiche nun ein bißchen vom Thema ab.
Ich habe ein paar selbstgeschriebene Klassen auf der Platte.
Die würde ich gerne in andere Projekte einfügen.

Wo muß ich die erzeugten dll's hinkopieren, damit ich sie mit "using" in mein neues Projekt einfügen kann?

Beispiel:
using System;

namespace LinAlg
{
	public class Matrix
	{
		private double[,] M;
		protected int m, n;

		public Matrix()
		{
			m = n = 0;
			M = new double[0,0];
		}
		public Matrix( int m, int n )
                                {
			this.m = m;
			this.n = n;
			M = new double[m,n];
		}
		public Matrix( int m, int n, double[] A ) 
		{
			this.m = m;
			this.n = n;
			int count = 0;
			M = new double[m,n];
			for( int i=0; i<m; i++ ) 
			{
				for( int j=0; j<n; j++ ) 
				{
					M[i,j] = A[count];
					count++;
				}
			}
		}
		public Matrix( double[,] A ) 
		{
			int m = A.Rank;
			int n = A.Length / A.Rank;
			M = new double[m,n];
			for( int i=0; i<m; i++ ) 
			{
				for( int j=0; j<n; j++ ) M[i,j] = A[i,j];
			}
		}
		public Matrix( Matrix A )
		{
			m = A.m;
			n = A.n;
			M = new double[m,n];
			M = toArray( A );
		}
		public Matrix( int m, int n, double c )  
		{
			this.m = m;
			this.n = n;
			M = new double[m,n];
			for( int i=0; i<m; i++ ) 
			{
				for( int j=0; j<n; j++ ) M[i,j] = c;
			}
		}

		public double get( int m, int n) 
		{
			try 
			{
				return M[m,n];
			}
			catch( Exception e ) 
			{
				throw new Exception( e.Message );
			}
		}
		public void set( int m, int n, double item ) 
		{
			try 
			{
				M[m,n] = item;
			}
			catch( Exception e ) 
			{
				throw new Exception( e.Message );
			}
		}
		public void identity( int m, int n ) 
		{
			M = new double[m,n];
			for( int i=0; i<m; i++ ) 
			{
				for( int j=0; j<n; j++ ) M[i,j] = (i==j) ? 1.0 : 0.0;
			}
		}
		public void random( int m, int n ) 
		{
			M = new double[m,n];
			Random r = new Random();
			for( int i=0; i<m; i++ ) 
			{
				for( int j=0; j<n; j++ ) M[i,j] = r.NextDouble();
			}
		}

usw....
(Die Liste geht ewig weiter...)

Im Projektverzeichnis wird ein Unteverzeichniss ("bin\Debug") erstellt.
Darin befindet sich eine Datei namens "LinAlg.dll".
Wo muß ich die nun hinkopieren, damit ich sie in anderen Projekten nutzen kann?

Danke...
Paratrooper.
private Nachricht | Beiträge des Benutzers
Cord Worthmann
myCSharp.de - Member



Dabei seit:
Beiträge: 1.207

beantworten | zitieren | melden

z.b. ins gleiche verzeichnis in dem sich deine neue dll oder exe befinden wird...

eine referenz auf die bereits kompilierte dll musst du wohl auch noch in dein neues projekt einfügen.



grtz
chief
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

beantworten | zitieren | melden

Dahin wo auch deine Exe oder was auch immer vom anderen Projekt ist. Des weiteren musst du Unter Projekt/Referenzen/ und dann auf den durchsuchen-Button klicken um eine Referenz auf dein Assembly anzufügen. Dann kannst du mit using dran....

--
mfg
Franknstein
Besuchen sie das VisualC++ - Forum
private Nachricht | Beiträge des Benutzers
VizOne
myCSharp.de - Member

Avatar #avatar-1563.gif


Dabei seit:
Beiträge: 1.373

beantworten | zitieren | melden

Ich hab gerade so mit nem halben Auge deine Matrix-Klasse überflogen, und mir fällt auf, dass du das hier:

public double get( int m, int n) 
		{
			try 
			{
				return M[m,n];
			}
			catch( Exception e ) 
			{
				throw new Exception( e.Message );
			}
		}
		public void set( int m, int n, double item ) 
		{
			try 
			{
				M[m,n] = item;
			}
			catch( Exception e ) 
			{
				throw new Exception( e.Message );
			}
		}

ersetzen könntest/solltest durch

public double this[int m, int n]
{
  get { return M[m, n]; }
  set { M[m, n] = value; }
}

(Das exception handling in deinem Code macht eigentlich gar keinen Sinn)

MfG VizOne
private Nachricht | Beiträge des Benutzers
Paratrooper
myCSharp.de - Member

Avatar #avatar-1887.gif


Dabei seit:
Beiträge: 22
Herkunft: LA

Themenstarter:

beantworten | zitieren | melden

@Frankenstein & Chief Brodie
Danke, hat wunderbar geklappt!

@VizOne
Dein Code ist natürlich einfacher und übersichtlicher. Werde wahrscheinlich auch so machen.
Aber: gegeben ist eine 3x3-Matrix. Wenn ich nun get(5,5) aufrufe, bricht das Programm ja ab, oder nicht?
Außerdem will ich die "throw new exception(blablabal)" durch eine MessageBox ersetzen (ob es einen Sinn hat, keine Ahnung).

Danke @all...
Paratrooper.
private Nachricht | Beiträge des Benutzers
cdr
myCSharp.de - Member



Dabei seit:
Beiträge: 980
Herkunft: Zürich

beantworten | zitieren | melden

Zitat
Original von Paratrooper
Aber: gegeben ist eine 3x3-Matrix. Wenn ich nun get(5,5) aufrufe, bricht das Programm ja ab, oder nicht?

Es wirft eine outofbounds exception ... das ist auch das einzige was bei so einem aufruf passieren soll (jedenfalls nicht eine MessageBox einblenden, MessageBoxen sind sache der Präsentationsschicht)
private Nachricht | Beiträge des Benutzers
Cord Worthmann
myCSharp.de - Member



Dabei seit:
Beiträge: 1.207

beantworten | zitieren | melden

das würde ich auch so sehen...

der nachteil, der dir durch das werfen einer neuen exception (so sie jetzt nur die basis-exception ist) entsteht, der du nur die message der ursprünglichen exception und keine inner-exception mitgibst, ist sogar der, dass du die ursprüngliche fehlerquelle verschleierst und späteres debugging erschwerst...


grtz
chief
private Nachricht | Beiträge des Benutzers