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...
ToString funktioniert immer noch nicht.
Die ToString-Methode war überschrieben. Habe nun deinen Code eingegeben. Die Ausgabe aber bleibt gleich ("System.Collections.ArrayList").
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;
}
}
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?
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....
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)
@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).
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)
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...