Erstellen eines Widerstandsnetzwerks

ChrSli5385

Mitglied
Hallo liebe Java Freunde, ich habe folgendes Verständnisproblem. Es soll ein Widerstandsnetwerk aufgebaut werden und eine bestimmte Schaltung repräsentiert werden. Außerdem gibt es die Vorgabe eine abstrakte Klasse "Net" zu erstellen (inkl. der Methode abstract double ohm() sowie eine Klasse "Widerstand",welche von der Klasse Net abgeleitet wird und 2 weitere Klassen, welche auch abgeleitet werden sollen von Net: Parallel und Reihe. Außerdem sind Wert angegeben von den Widerständen. Nun aber zu meiner Frage: Die Musterlösung enthält einen default Konstruktor welcher als Attribut bezeichnet wird und mitunter in der Klasse Parallel vor die Instanzvariablen geschrieben wird (Siehe code) ich habe dies vorher noch nicht gesehen und wüsste gerne welche Thematik ich mir anschauen muss um dies nachvollziehen zu können. Gerne lade ich ggf. den vollständigen Code hoch falls notwendig..

Java:
public abstract class Net {
    
    // Attribute
    
    Net(){  // ist dies nicht ein default constructor??  Und abstract heißt doch dass kein Objekt erstellt werden soll in dieser Klasse
        
    }
    // Methoden
    
    abstract double ohm();
    
}

// hier dann die Klasse "Reihe

public class Reihe extends Net {
    
    // Attribute
    private Net wn1; // hier dann der Klassenname "Net" vor den Instanzvariablen, habe das so noch nicht gesehen
    private Net wn2;
    
    // Konstruktor
    
    public Reihe(Net a, Net b) { // hier dann als Übergabeparameter ???
        this.wn1 = a;
        this.wn2 = b;
    }
    
    // Methode
    
    public double ohm() {
        return wn1.ohm() + wn2.ohm();
    }
    
    
}
 
Erstmal was zum Modifizierer abstract:
Abstrakte Klassen werden benutzt um Objekte zu klassifzieren, die zwar zusammengehören, deren Instanzierung aber nicht möglich oder unsinnig ist.

Beispiel: Du hast einen Mercedes AMG, einen BMW M3 und einen Audi A6. Alle könnten von einer abstrakten Klasse Auto abgeleitet sein. Du kannst z.B. sagen daß du ein Auto kaufst, oder irgendein Auto durch die Waschstraße fährst, es ist ja egal ob da jetzt der BMW oder der Mercedes drinsteht.

Du wirst aber sicherlich nicht zum Händler gehen und sagen daß du irgendein Fahrzeug haben willst. Oder?

Bei Methoden ist es im Prinzip das Gleiche: man macht sie abstrakt wenn sie für die Klasse einerseits wesentlich sind, deren Implementierung aber z.B. von der konkreten Ableitung der Klasse abhängig ist. Du kannst der Klasse Fahrzeug z.B. eine abstrakte Methode machGeraeusch(); mitgeben. Dann ist sichergestellt, daß jedes Fahrzeug ein Geräusch von sich gibt, was z.B. beim BMW ein sattes System.out.println("BRUUUUUUMMMMMM BRUUUUUUUMMMMM"); ist, bei einem Ford Fiesta ein System.out.println("töff töff");.

Aber: eigentlich faßt man gleichartige Dinge in einem Vererbungsbaum zusammen. Wobei es immer etwas Interpretationssache ist, was man als gleichartig versteht. Pflanzen und Tiere können gleichartig sein, sind ja alles Lebewesen. Andererseits würde ein Tier z.B. eine Methode fressen(); implementieren, was bei Pflanzen definitiv ein Problem wäre. Bei Tieren könnte man auf das Problem stoßen, daß man zwischen Herbivoren und Karnivoren unterscheiden muß und ein gemeinsamer Verbungsbaum deshalb vielleicht ein Problem wäre. Wie gesagt - es kommt drauf an was man vor hat.

Und da erschließt sich mir z.B. in deiner Aufgabe nicht, wie ihr da den Vererbungsbaum aufziehen sollt. Ich bin ja E-Techniker, von Informatik habe ich dagegen keien Ahnung. Und ein Netz sind eigentlich alle Punkte mit einem gemeinsamen Potential, bzw. alles was an einem Knoten hängt. Ein Netz hat deshalb z.B. keine Impedanz, und eine Methode double ohm(); wäre entsprechend zwecklos. Und ein Widerstand ist ein Bauteil, kein Netz. Ein Widerstand hängt höchstens zwischen zwei oder mehr Netzen.
 
Danke für deine Antwort White_Fox. Allerdings ist meine eigentliche Frage, warum der Klassenname hinter den Instanzvariablen steht damit nicht beantwortet
 
Allerdings ist meine eigentliche Frage, warum der Klassenname hinter den Instanzvariablen steht damit nicht beantwortet
private Net wn1; // hier dann der Klassenname "Net" vor den Instanzvariablen, habe das so noch nicht gesehen

Na das ist einfach eine Instanzvariable vom Typ "Net", wie bei jeder anderen Variablendeklaration auch.

Über den Konstruktor können zwei Instanzen von "Net" übergeben werden, die dann diesen Instanzvariablen zugewiesen werden.
 
Genau. Irgendwie mußt du dem Compiler ja mitteilen, was das Ding in dieser Membervariable sein soll. Und noch etwas:
Java:
public abstract class Net {

    // Attribute

    Net(){  // ist dies nicht ein default constructor??  Und abstract heißt doch dass kein Objekt erstellt werden soll in dieser Klasse
    
    }
    //...
}

Nur weil eine Klasse abstrakt ist, heißt das ja nicht daß sie keine Funktionalität bereitstellen könnte. Schau dir z.B. mal Folgendes an:
Java:
public abstract class Vehicle{
    private final double maxPower;

    public Vehicle(double maxPower){
        this.maxPower = maxPower;
    }

    public double getMaxPower(){
        return maxPower;
    }

    public void getNoise(){
        System.out.println(getConcreteNoise);
    }

    private abstract String getConcreteNoise();
}

Die Klasse Vehicle ist abstrakt, aber benötigt dennoch einen Konstruktor. Dafür vereinfacht sich die Benutzung der Klasse aber so:
Java:
public class BMWM3 extends Vehicle{
    public BMWM3(){
        super(350);
    }

    private String getConcreteNoise(){
        return "ROOOOOOAAAAARRRRRRRR";
    }
}
 
Zuletzt bearbeitet:
Und da erschließt sich mir z.B. in deiner Aufgabe nicht, wie ihr da den Vererbungsbaum aufziehen sollt. Ich bin ja E-Techniker, von Informatik habe ich dagegen keien Ahnung. Und ein Netz sind eigentlich alle Punkte mit einem gemeinsamen Potential, bzw. alles was an einem Knoten hängt. Ein Netz hat deshalb z.B. keine Impedanz, und eine Methode double ohm(); wäre entsprechend zwecklos. Und ein Widerstand ist ein Bauteil, kein Netz. Ein Widerstand hängt höchstens zwischen zwei oder mehr Netzen.
Ich vermute mal, dass mit "Netz" hier ein System von Widerständen zwischen zwei gegebenen Punkten gemeint ist. Zwischen den Punkten A und B in folgendem Beispiel könnte man das mit Parallel(Parallel(Resistor(100), Resistor(220), Resistor(470)), Serial(Resistor(220), Resistor(470))) beschreiben:
Code:
         +-----+
     +---+ 100 +---+
     |   +-----+   |
     |             |
     |   +-----+   |
A----+---+ 220 +---+---------+----B
     |   +-----+   |         |
     |             |         |
     |   +-----+   |         |
     +---+ 470 +---+         |
     |   +-----+             |
     |                       |
     |   +-----+   +-----+   |
     +---+ 220 +---+ 470 +---+
         +-----+   +-----+
So würde beides einen Sinn ergeben: Dass ein Netz einen Widerstandswert hat und ein Widerstand ein spezielles Netz ist.
 
Na das ist einfach eine Instanzvariable vom Typ "Net", wie bei jeder anderen Variablendeklaration auch.

Über den Konstruktor können zwei Instanzen von "Net" übergeben werden, die dann diesen Instanzvariablen zugewiesen werden.

Also statt dem "Datentypen" wie ich es eig. kennengelernt habe (z.B Integer oder double) kann man auch den Klassennamen nehmen, ok. Ich bin halt Anfänger und es ist etwas verwirrend wenn man so etwas vorher noch nicht gesehen hat.
 
Ich vermute mal, dass mit "Netz" hier ein System von Widerständen zwischen zwei gegebenen Punkten gemeint ist.
Das würde zwar im Kontext Sinn ergeben, würde sich aber "Zweipol" nennen. Und Vierpole usw. gibts auch noch. 😉


Also statt dem "Datentypen" wie ich es eig. kennengelernt habe (z.B Integer oder double) kann man auch den Klassennamen nehmen, ok.
Auch Objekte sind bloß Datentypen. Integer, Double, usw. sind primitive Datentypen, wenn du eine Unterscheidung dazwischen willst.
 
Also statt dem "Datentypen" wie ich es eig. kennengelernt habe (z.B Integer oder double) kann man auch den Klassennamen nehmen
Klassen wäre sehr nutzlos, wenn man keine Instanzen davon erstellen und diese in Variablen speichern könnte. Salopp gesagt, sind Klassen selbst erstellte Datentypen, wobei es bei Java natürlich eine riesige Menge bereits mitgelieferter Klassen gibt.

Aufgepasst übrigens bei "int" und "Integer". "int" ist ein primitiver Datentyp und "Integer" ist eine sog. Wrapperklasse, die einen int aufnimmt. Genauso gibt es übrigens "double" und "Double", "long" und "Long", usw.
 
Ich glaube, Du benötigst eine rekursive Lösung.

Du solltest ein Interface/abstrakte Oberklasse Net haben.
Diese sollte eine Methode getOhm oder besser getComputedWiderstand haben.

Eine Implementierung ist ein einfacher Widerstand, bei dem diese Methode einen festen Wert bzw. den Wert eines Feldes zurückgibt.

Eine zweite Implementierung ist die Reihenschaltung zweier (als Felder) oder mehrerer (als Array) Net.
Hier wird von der Methode getComputedWiderstand die Summe gesammelten getComputedWiderstand zurückgegeben.

Eine dritte Implementierung ist die Parallelschaltung.
Hier wird von der Methode getComputedWiderstand der berechnete Paralellwiederstand zurückgegeben.

Die Idee ist, das sich jedes Net nur aus einem einfachen Widerstand, einer Reihenschaltung (rekursiv) oder einer Paralellschaltung (rekursiv) bestehen kann.

Ich glaube, damit habe ich die Aufgabe für Dich gelöst, denn diese Lösung hat Dein Lehrer sicher von einem guten Informatiker erwartet, vor allem, dass er selbst drauf kommt.
 

Zurück
Oben