[C#] Spelen met generics

  • Onderwerp starter Onderwerp starter avo
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

avo

Gebruiker
Lid geworden
26 sep 2006
Berichten
35
Hi,
Ik ben een oefening aan het maken in mijn boek van visual C# - de basis.
Maar ik heb veel problemen met het maken van de oefening, ik snap er eigenlijk niet veel van. ik heb alles herlezen en herlezen in mijn boek en ik blijf evenver staan.

Met de oefening moet ik een interface maken met de naam: Koers ,waarin OpenKoers en SlotKoers kunnen worden opgeslagen.
Deze interface moet ik implementeren in de klassen van aandelenKoers en ObligatieKoers.
Naderhand moet ik een generieke koerswijzeging klassen maken die enkel de objecten accepteerd die de koers interface implementeerd.
instantieer een List<T> klasse en voeg tien verschillende koerswijzegingsobjecten toe. loop door de lijst en toon per bericht of er spraken is van verhoging.


Dit is mijn code.

Code:
namespace Oefenining4._2
{
    // Koers-Interface waar openkoers en slotkoers opgeslagen worden. 
    interface Koers
    {
        void OpenKoers();
        void GeslotenKoers();
    }
    public class AandelenKoers
    {
        // implementeer de interface in aandelenkoers
        public static void OpenKoers() { }
        public static void GeslotenKoers() { }
    }
    public class ObligatieKoers
    {
        // implementeer de interface in ObligatieKoers
        public static void OpenKoers() { }
        public static void GeslotenKoers() { }
    }
    public class KoersWijzeging<T> 
    {
    } 
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}


Dank bij voorbaat.
 
Ik weet niet of je nog steeds hulp nodig hebt, maar wat is het probleem?
Interfaces moeten trouwens altijd beginnen met een I.

Je kan een Interface implementeren op deze manier:
Code:
namespace Oefenining4._2
{
    // Koers-Interface waar openkoers en slotkoers opgeslagen worden. 
    interface IKoers
    {
        void OpenKoers();
        void GeslotenKoers();
    }
    public class AandelenKoers : IKoers
    {
        // implementeer de interface in aandelenkoers
        public static void OpenKoers() { }
        public static void GeslotenKoers() { }
    }
    public class ObligatieKoers : IKoers
    {
        // implementeer de interface in ObligatieKoers
        public static void OpenKoers() { }
        public static void GeslotenKoers() { }
    }
    public class KoersWijzeging<T> 
    {
    } 
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
 
De naam maakt toch niets uit ?
Maar het is wel handiger als je er een I voorzet.
Ik kan nogaltijd niet verder. ik probeer het te zoeken maar ik kom er gewoon niet op.

Implementeren is dan overerven ?
 
Laatst bewerkt:
Wat is precies je doeleinde? Misschien heb ik dit over het hoofd gezien.
Zou je het nogmaals kunnen uitleggen?

De naam maakt toch niets uit ?
Maar het is wel handiger als je er een I voorzet.
Klopt, de naam maakt niet uit.
Maar programmeren kent vele regels, één hiervan is dat je een interface altijd met een I begint.
 
de letterlijke opgave is

Maak een koers-interface waarin openinskoers en slotkoers kunnen worden opgeslagen. implementeer deze interface vervolgens in een aandelenkoers - en ObligatieKoers-Klasse. Maak een generieke koerswijzegings-klasse die enkel objecten accepteert die de koers-interface implementeren. Instantieer een List<T>- klasse en voeg tien verschillende koerswijzegingsobjecten toe. Loop dan de lijst door en toon per object of er sprake is van een verhoging of verlaging


ik vind het echt een ingewikkelde oefening :(.

Dankuwel voor mij wat opweg te helpen, want ik snap er nietveel van.
 
Maar programmeren kent vele regels, één hiervan is dat je een interface altijd met een I begint.
Dat is geen programmeerregel. Dat is niets anders dan een persoonlijke voorkeur.


De bedoeling van die opgave is dat je een klasse (interface) Koers aanmaakt.
Deze Koers klasse heeft dan twee functies, eentje om de openingskoers mee op te slaan en eentje om de slotkoers mee op te slaan.
Deze functionaliteit moet je in de klasse definiëren, maar hoeft nog geen implementatie te hebben, dat is het idee achter een interface.

AandelenKoers en ObligatieKoers zijn dan specialisaties van de klasse Koers (hint: inheritance).
Zij implementeren de functionaliteit die Koers aangeeft dat ze moeten hebben.

Vervolgens maak je een functie IsVerhoogd() die een parameter van het type Koers accepteert.
Omdat AandelenKoers en ObligatieKoers dus afstammen van de Koers klasse kun je deze dus ook meegeven aan die functie.

Nu maak je een lijst van Koers klasses, waar je dus weer AandelenKoersen en ObligatieKoersen beide in kunt stoppen, en die doorloop je en roep je de functie IsVerhoogd() op aan.
Aan de hand hiervan kun je bepalen of de koers verhoogd is. (Als dit niet het geval is, hoeft het nog niet zo te zijn dat hij verlaagd is, hij kan ook gelijk gebleven zijn)


En als klein foutje: het woord schrijf je als wijzIging ;)
 
Laatst bewerkt:
Ik heb het voor dehelft beet denk ik ;).
Voor gegevens op te slaan moet ik gebruik maken van property's.

Maar nu weet ik niet hoe ik die " AandelenKoers en ObligatieKoers dus afstammen van de Koers klasse kun je deze dus ook meegeven aan die functie "
Kan maken.

Code:
namespace ConsoleApplication1
{
    interface Koers
    {
        int openKoers { set; get; }
        int SlotKoers { set; get; }
    }

    public class AandelenKoers : Koers // AandelenKoers Inheritance Koers.
    {
        int openKoers { set; get; }
        int SlotKoers { set; get; }
    }

    public class ObligatieKoers : Koers
    {
        int openKoers { set; get; }
        int SlotKoers { set; get; }
    }

    class Program
    {
        public static void IsVerhoogd(Koers koers)
        {
        } 

        static void Main(string[] args)
        {
        }
    }
}
 
Dat heb je al gedaan :).

In jouw code zijn AandelenKoers en ObligatieKoers dus specialisaties van Koers en vallen dus ook onder het type Koers.

Omdat jouw functie IsVerhoogd() een parameter met het type Koers accepteert, kun je nu variabelen aanmaken van de typen AandelenKoers en ObligatieKoers en die meegeven aan de functie.
 
Ik heb nu momenteel dit, ik hoop dat dit juist is.
Maar nu wil ik IsVerhoogd(Koers koers) wil aanroepen in mijn main funtie, hoe kan ik dit beste oplossen.
Ik heb Koers koers; een uit de parameters gehaald en eronder gezet maar dan krijg de foutmelding dat ik "local variabele 'koers' moet gebruiken".

Dankuwel Arjan B voor mij opweg te helpen:D dit had ik alleen niet gekunt.

Code:
namespace ConsoleApplication2
{
    interface Koers
    {
        int openKoers { set; get; }
        int SlotKoers { set; get; }
    }

    public class AandelenKoers //: Koers // AandelenKoers Inheritance Koers.
    {
        int openKoers { set; get; }
        int SlotKoers { set; get; }
    }

    public class ObligatieKoers //: Koers
    {
        int openKoers { set; get; }
        int SlotKoers { set; get; }
    }

    class Program
    {
        public static void IsVerhoogd(Koers koers)
        {
            int Verschil = koers.openKoers - koers.SlotKoers;
            Console.WriteLine("OpenKoers:");
            koers.openKoers = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Slotkoers:");
            koers.SlotKoers = Convert.ToInt32(Console.ReadLine());

            if (Verschil < 0)
            {
                Console.WriteLine("Verlaging;");
                Console.ReadLine();
            }
            else if (Verschil > 0)
            {
                Console.WriteLine("Verhoging");
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine("Niets verranderd");
                Console.ReadLine();
            }
        }

        static void Main(string[] args)
        {
            //   IsVerhoogd(Koers koers)  //  Hoe krijg ik dit hierin
        }
    }
}
 
De functie IsVerhoogd() verwacht een instantie van een object. Je moet dus een object meegeven.

Zoiets:
Code:
Koers koers1 = new AandelenKoers();
koers1.openKoers = 10;
koers1.slotKoers = 50;

IsVerhoogd(koers1);

Koers koers2 = new ObligatieKoers();
koers2.openKoers = 20;
koers2.slotKoers = 30;

IsVerhoogd(koers2);

Je geeft nu een object van AandelenKoers en eentje van ObligatieKoers mee, en dat kan omdat ze zijn afgeleid van de klasse Koers. :)
 
Dat is geen programmeerregel. Dat is niets anders dan een persoonlijke voorkeur.
Op dit moment doe ik een studie Game-Development in C#.
Ook heb ik stage gelopen bij een multimedia bedrijf.
Beide instellingen hebben mij vertelt dat interfaces altijd met een I begint. Dit heeft niks met mijn persoonlijk voorkeur te maken.

Stel jij bent deel van een team in een bedrijf en jij moet een deel van een project programmeren. Op een gegeven moment ben jij klaar en gaat iemand verder met jou source. Als jij volgens al jou eigen voorkeuren gaat programmeren dan heeft de volgende zoiets van "Wat is wat?".

Zo zijn er nog veel meer regels.

EDIT:
Neem als voorbeeld deze pagina: http://msdn.microsoft.com/en-us/library/64syzecx.aspx
Alle interfaces beginnen met een I.

Probeer ook maar is in C# te gaan, en tik maar gewoon is in: I
Zo zie je dat alle interfaces beginnen met een I.
 
Laatst bewerkt:
Dat deze persoonlijke voorkeur door veel mensen en bedrijven wordt gehanteerd betekent niet dat het een verplichting is.
Op het internet vind je vele discussies over het prefixen van variabelen en klasses, waarbij mensen voor- en tegenargumenten naar elkaar gooien zonder dat er een einde aan komt. Zoals bij al dit soort discussies komt het er op neer dat je voor jezelf moet bedenken waarom één van de twee opties handig zou zijn voor jou en dan voor die kiezen. Jij koos bijvoorbeeld voor consistentie omdat veel door jouw gebruikte interfaces hun naam prefixed is met een I. Dat mag, maar het is geen regel.
Omdat dit totaal off-topic gaat zal ik hierna alleen nog maar on-topic reageren :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan