Telefoon program classen

Status
Niet open voor verdere reacties.

rambomambo

Gebruiker
Lid geworden
9 dec 2012
Berichten
163
Ik heb dus 3 buttons staan en 1 label in dat label moet er komen welke telefoon er rinkelt dus heb het als volgende gedaan een abstructed klasse telefoon daar zit er dus een code in

string telefoon = "telefoon rinkelt";


public string bellen()
{
return telefoon;

}

dit werkt dus al in mijn mainwindow maar nu wil ik dus van 2 andere klassen overerven dus van de klasse GSM en klasse Digitale telefoon, dus ik zou willen als je op digitale telefoon drukt er digitale telefoon rinkelt komt en je op gsm drukt er mobiele telefoon rinkelt komt, maar met zo weinig mogelijk code natuurlijk dus dat je dit met de code in klasse telefoon zou kunnen bedienen ik hoorde dat je dit met overriden zou kunnen doen maar weet echt niet hoe het moet weet er iemand hier een oplossing voor ?
 
Als je de basisfunctie niet altijd direct gebruikt kun je die "virtual" maken en inderdaad via "override" vervangen. Je kunt ook de naam opslaan in de class en dan de originele functie gebruiken om de naam te tonen.

Daarbuiten kun je ook nog een interface definiëren en de interface implementeren in elke class. De hoeveelheid werk en wat de beste oplossing is vaak afhankelijk van de situatie en op welk niveau je de originele code nodig hebt / wil gebruiken.

Daar in C# je niet kunt erven van 2 classes zul je volgens mij moeten werken met interfaces en niet met override (tenminste dat is wat ik begrijp uit je verhaal)
 
ja ik heb dus in de klasse telefoon een methode bellen met de naam bellen() die een return van string = "telefoon rinkelt" returnd.
in klasse elektrische telefoon heb ik ook een methode bellen() die de string " elektrische telefoon rinkelt" returnd nu zou ik willen
dus van die bellen() in elektrische telefoon een override van maken maar dan krijg ik een foutmelding iets over een hided member
 
Mijn "probleem" met deze stelling is dat het hier ook kan met een enkele class en protected member:

Code:
public class grandparent
{
   protected string WatRinkeld;
   public string rinkeld()
   {
      return WatRinkeld + " rinkeld";
   }
   public grandparent()
   {
      WatRinkeld = "telefoon"
   }
}


public class parent : grandparent
{
   public parent()
   {
      WatRinkeld = "elektrische telefoon"
   }
}

Als je deze classes aanmaakt en "rinkeld()" aanroept krijg je de juiste output zonder de volledige procedure te herschrijven

*edit*

overerving vergeten in de code
 
Laatst bewerkt:
En waarom zou je hier een protected member of overerving nodig hebben? Iets als het onderstaande lijkt me ook gewoon te volstaan:

[cpp]
public class Telefoon {
private string type;

public Telefoon(string type) {
this.type = type;
}

public string bellen() {
return type + " rinkelt";
}
}
[/cpp]
 
Dan neem je natuurlijk wel een heel gesimplificeerde kijk :P

Ik neem aan dat de TS een voorbeeld zoekt met werkelijke classes en overerving voor een oefening of opdracht.
 
Ja, wellicht neem ik een te simpele kijk. Maar dan nog zie ik niet in waarom 'WatRinkeld' in de hele child-klasse beschikbaar zou moeten zijn in je voorbeeld? Wellicht denk ik weer te simpel en sowieso zal het weinig uitmaken, dus alleen om de TS ook nog een andere oplossing te bieden (gezien ik er zeker van ben dat je OOP beheerst):

[cpp]
public class grantparant {
private string WatRinkeld;
public grantparant(string WatRinkeld) {
this.WatRinkeld = WatRinkeld;
}
public string rinkeld() {
return WatRinkeld + " rinkeld";
}
}

public class parent : grantparent {
public parent() : base("elekstrische telefoon") {
}
}
[/cpp]
 
Een goede oplossing voor deze opdracht. Hoewel ik persoonlijk de constructor niet zou misbruiken in een complexe structuur puur om de childname van de klasse terug te geven.

Het core object in .NET heeft een .gettype() methode die alle objecten altijd overerven en in principe net zo werkt. Als je de classname goed kiest zou je in principe dus zelfs met gettype kunnen cheaten. Maar dat gaat wel heel erg ver offtopic
 
Het 'probleem' dat wanneer je je protected member in de constructor zet is dat het optioneel is. Meegeven in de base van de constructor is verplicht wat ook meestal de bedoeling is bij abstract classes.

Een andere optie zou zijn door een property abstract te implementeren, en dat het type public met alleen een getter beschikbaar is lijkt me wel handig.


Code:
    public abstract class PhoneBase
    {
        public abstract string Type { get; }

        public string Call()
        {
            return string.Format("{0} Ringing...", Type);
        }

        public override string ToString()
        {
            return Type;
        }
    }

    public class Smartphone : PhoneBase
    {
        public override string Type
        {
            get { return "Smartphone"; }
        }
    }

Zo moet je child class dit property aanmaken zoals hierboven. Zoals gewoonlijk verschillende methode om dit te doen en veelal persoonlijke voorkeur :P
En zodra je dingen uit een database/file haalt zal het alweer anders zijn.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan