Laden...

Konstruktor in der Oberklasse aufrufen

Erstellt von Paratrooper vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.225 Views
Paratrooper Themenstarter:in
22 Beiträge seit 2004
vor 19 Jahren
Konstruktor in der Oberklasse aufrufen

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:

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 + ")";
}
}

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:

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.

N
4.644 Beiträge seit 2004
vor 19 Jahren

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);
}
Paratrooper Themenstarter:in
22 Beiträge seit 2004
vor 19 Jahren

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.

N
4.644 Beiträge seit 2004
vor 19 Jahren
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());
Paratrooper Themenstarter:in
22 Beiträge seit 2004
vor 19 Jahren

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.

N
4.644 Beiträge seit 2004
vor 19 Jahren

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;
	}
}
Paratrooper Themenstarter:in
22 Beiträge seit 2004
vor 19 Jahren

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.

C
1.215 Beiträge seit 2004
vor 19 Jahren

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

F
529 Beiträge seit 2003
vor 19 Jahren

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

1.373 Beiträge seit 2004
vor 19 Jahren

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

Paratrooper Themenstarter:in
22 Beiträge seit 2004
vor 19 Jahren

@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.

C
980 Beiträge seit 2003
vor 19 Jahren

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)

C
1.215 Beiträge seit 2004
vor 19 Jahren

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