Variabelen in Class gebruiken in andere class

Status
Niet open voor verdere reacties.

goedlichtJoost

Gebruiker
Lid geworden
7 mrt 2012
Berichten
477
Hallo allemaal,

Ik loop even te stoeien met verschillende classes. Ik zal zo duidelijk mogelijk omschrijven wat ik gedaan heb en wat ik wens, dan hoop ik dat jullie mij kunnen vertellen wat ik fout doe.
Ik heb een main form en aan de hand van verschillende textboxen en berekeningen kom ik tot een lijst variabelen. Dit afstand maten, om het makkelijk te houden laten we zeggen, lengte breedte hoogte.

Nu heb ik een aparte class aangemaakt, genaamd: Gegevens.cs

In deze class staat enkel:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LessenaarHandler
{
    public class Gegevens
    {

        public double Width { get; set; }
        public double Height { get; set; }
        public double Length { get; set; }
    }
}

nu heb ik in mijn main form deze class aangemaakt:
Code:
public Gegevens Gegevens = new Gegevens();

En vervolgens schrijf ik deze waardes hier naar toe:
Code:
Gegevens.Width = variabele1;
Gegevens.Height= variabele2;
Gegevens.Length= variabele3;

Nu zou ik deze lijst met gegevens graag in een andere class gebruiken, zeg bijvoorbeeld de gegevens gebruiken in berekeningen. dus aan het einde van mijn form1 ga ik naar de functie Calc,
Dit is een class met de naam Berekeningen waar de functie Calc in staat die gebruik gaat maken van de gegevens in de GegevensClass

De Berekeningen class ziet er dus als volgt uit:

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LessenaarHandler
{
    public class Berekeningen
    {

       public Gegevens Gegevens = new Gegevens();


       public void Calc()
       {
       double result = Gegevens.Width * Gegevens.Height;
       MessageBox.Show(result.ToString());
}
}
}

maar wat er nu mis gaat, is dat denk ik doordat ik de nieuwe class weer "aanmaak" ofzo, dat alle variabele leeg zijn. Dus Result is 0*0 = 0...
Wat moet ik veranderen, om in mijn 2e class vol met functies gebruik te kunnen maken van mijn lijst met gegevens in een andere class.

Ik hoop dat het een beetje duidelijk is, als je vragen hebt stel ze dan!

Met vriendelijke groeten
Joost braun
 
Je zou daarvoor een constructor kunnen gebruiken die een gegevens-object als parameter krijgt. Iets als:

[cpp]
public class Berekeningen {
private Gegevens _gegevens;

public Berekeningen(Gegevens g) {
_gegevens = g;
}

public void Calc() {
// hier gebruik je _gegevens
}
}[/cpp]
 
Hallo COD_NL,

Bedankt voor je reactie!
Ik weet niet precies wat je bedoelt.

Ik vervang op mijn class (waar ik de gegevens wil gebruiken) public Gegevens Gegevens = new Gegevens(); door:

Code:
 private Gegevens _gegevens;
 
        public Berekeningen (Gegevens g) {
        _gegevens = g;
        }
Ik krijg dan een error: LessenaarHandler.Berekeningen does not contain a constructor that takes 0 arguments.
Met een error streep onder : public Berekeningen Berekeningen = new Berekeningen(); (op form1 dus)


En hoe moet ik nu de variabelen gebruiken?

Ik zou erg blij zijn met iets meer uitleg, iets meer voor dummy's :P

Alvast bedankt!

gr Joost
 
Laatst bewerkt door een moderator:
Hier heb je dus je Berekeningen class aangemaakt met een 'default constructor' (zonder parameters), maar je class heeft alleen de constructor met een Gegevens parameter. Deze zul je dus moeten invoeren als je een nieuwe Berekeningen class maakt

Code:
private Gegevens _gegevens = new Gegevens();
private Berekeningen _berekeningen = new Berekeningen(_gegevens);

Het voorbeeld van COD_NL is in deze zin dus perfect omdat de class niet zonder de benodigde berekeningen kan worden aangemaakt.

Als je gegevens class teveel andere dingen bevat (wat niet zou moeten). Kun je ook i.p.v. de gegevens in de constructor mee te geven het afhankelijk maken van de Method die de berekening doet.

Code:
private Gegevens _gegevens = new Gegevens();
private Berekeningen _berekeningen = new Berekeningen();

en dan ergens
Code:
double area = _berekeningen.CalcArea(_gegevens.Width, _gegevens.Length);

Deze afweging kun je het beste zelf maken, als er veel bereken methods gebruik maken van de gegevens class is de contructor parameter een goede oplossing, maar als de gegevens wijzigen moet je de berekeningen class wel 'updaten' met de nieuwe gegevens. Als dit vaak voorkomt zou je misschien liever de waardes direct aan de methods geven.
 
Hallo GoedLichtJoost,
Volgens mij zou je je Class Gegevens mee kunnen sturen als parameter naar de functie Calc in de Class Berekeningen. Ik heb hier geen C#, maar dat zou er zo ongeveer uit komen te zien. Dit is dan je class Berekeningen:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LessenaarHandler
{
    public class Berekeningen
    

       public void Calc(Gegevens Gegevens123)
       {
       double result = Gegevens123.Width * Gegevens123.Height;
       MessageBox.Show(result.ToString());
}
}
}

Je class Gegevens is nu dus een parameter die Gegevens123 wordt genoemd. Je Class gegevens verander je niks aan. Je main komt er dan zo uit te zien:

Code:
public Gegevens Gegev = new Gegevens();
public Berekeningen Bereken = new Berekeningen();

Public int main()
{

Gegev.Width = variabele1;
Gegev.Height= variabele2;
Gegev.Length= variabele3;

Bereken.Calc(Gegev);
}
 
Laatst bewerkt:
@ifstatement: in het geval je alleen een instantie van een Berekening maakt voor het aanroepen van Calc, zou ik hem eerder static maken.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan