Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2018-04-12, 19:14
  #1
Medlem
Tjena. Som rubriken lyder så har jag en uppgift att göra ett program som kallas Joppeshundar.

De jag har problem med är en metod som heter Feed(). Den går ut så att jag ska mata någon av djuren.
Sen har jag en Hungry_Animal(); Den styr om djuret får sin favoritmat blir den mätt å nöjd, får den något annat blir den arg. Men katten har en override på Hungry_Animal metoden för får den inte favoritmaten så är de 50%den fångar en mus och då skrivs de ut om den lyckades eller inte.

Har tre djur. och dom har jag lagrat i min AnimalList. En hund katt och en valp!

Kod:
namespace Arvjoppeshundar
{
   abstract class 
Animals
    
{
        protected 
int age;
        protected 
string name;
        protected 
string fav_food;
        protected 
string breed;
        protected 
bool hungry;

        public 
bool Hungry
        
{
            
get { return hungry; }
            
set hungry value; }                                                    
        }

        public 
int Age
        
{
            
get { return age; }
            
set age value; }
        }

        public 
string Name
        
{
            
get { return name; }
            
set name value; }
        }

        public 
string FavFood
        
{
            
get { return fav_food; }
            
set fav_food value; }
        }
        public 
string Breed
        
{
            
get { return breed; }
            
set breed value; }
        }

        public 
virtual void Interact()
        {
            
Console.WriteLine("Playing with {0}}",name);
        }


        public 
void Eat(string food)
        {                  
            
Hungry_animal();
        }

        public 
virtual void Hungry_animal()
        {
            if (
Hungry.Equals(FavFood)) //Denna som ska styra om den får favorit mat eller inte  
            
{
                
Console.WriteLine($"{name}is ate up the food and loved it!");
            }
           else
            {
                
Console.WriteLine($"{name} wants {FavFood} NOW!!");
            }
        }
    }
}

Class 
PetOwner

    
public void Feed()
        {
            
/*
            Denna metod frågar användaren vilket djur som Joppe ska mata och därefter anropa det
            djurobjektets metod för detta (eat()). Denna metod hanterar också vilken mat som Joppe
            ska mata hunden med och som ska skickas med som en inparameter till denna metod.
            */
            
Console.WriteLine("Which animal do you want to feed?");
            
Console.WriteLine("Dog,Cat or Puppy?");
            
string AnimalChoise Console.ReadLine();
            
AnimalList.Add(new Dog("Dogge"5));
            
AnimalList.Add(new Cat("Kitty"10));
            
AnimalList.Add(new Puppy(2));
           
            if (
AnimalChoise.Equals("Dog"))
            {
               
AnimalList[0].FavFood "Pizza";
                
AnimalList[0].Eat("Pizza");
            }
            if (
AnimalChoise.Equals("Cat"))        //Vet att detta säkert ser jättedumt ut men hur gör jag?
            
{
                     
AnimalList[1].FavFood "Fish";
                
AnimalList[1].Eat("Pizza");
            }  
            if (
AnimalChoise.Equals("Puppy"))
            {
                
AnimalList[0].FavFood "Hamburger";
                
AnimalList[0].Eat("Fish");
            }
        }


De jag vill göra är då att sätta en favoriträtt på varje djur och sen skicka in en inparameter i Eatt(//favoriträtt) och jämföra den med djurets favoritmat och beroende på så löser metoden Hungry_Animals de med olika utskrifter! 

Om jag förklarat luddigt be mig förklara mera:) 

Mycket tacksam för hjälp! Vore guldvärt<3
Citera
2018-04-12, 19:20
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av Douknowme
Tjena. Som rubriken lyder så har jag en uppgift att göra ett program som kallas Joppeshundar.

De jag har problem med är en metod som heter Feed(). Den går ut så att jag ska mata någon av djuren.
Sen har jag en Hungry_Animal(); Den styr om djuret får sin favoritmat blir den mätt å nöjd, får den något annat blir den arg. Men katten har en override på Hungry_Animal metoden för får den inte favoritmaten så är de 50%den fångar en mus och då skrivs de ut om den lyckades eller inte.

Har tre djur. och dom har jag lagrat i min AnimalList. En hund katt och en valp!

Kod:
namespace Arvjoppeshundar
{
   abstract class 
Animals
    
{
        protected 
int age;
        protected 
string name;
        protected 
string fav_food;
        protected 
string breed;
        protected 
bool hungry;

        public 
bool Hungry
        
{
            
get { return hungry; }
            
set hungry value; }                                                    
        }

        public 
int Age
        
{
            
get { return age; }
            
set age value; }
        }

        public 
string Name
        
{
            
get { return name; }
            
set name value; }
        }

        public 
string FavFood
        
{
            
get { return fav_food; }
            
set fav_food value; }
        }
        public 
string Breed
        
{
            
get { return breed; }
            
set breed value; }
        }

        public 
virtual void Interact()
        {
            
Console.WriteLine("Playing with {0}}",name);
        }


        public 
void Eat(string food)
        {                  
            
Hungry_animal();
        }

        public 
virtual void Hungry_animal()
        {
            if (
Hungry.Equals(FavFood)) //Denna som ska styra om den får favorit mat eller inte  
            
{
                
Console.WriteLine($"{name}is ate up the food and loved it!");
            }
           else
            {
                
Console.WriteLine($"{name} wants {FavFood} NOW!!");
            }
        }
    }
}

Class 
PetOwner

    
public void Feed()
        {
            
/*
            Denna metod frågar användaren vilket djur som Joppe ska mata och därefter anropa det
            djurobjektets metod för detta (eat()). Denna metod hanterar också vilken mat som Joppe
            ska mata hunden med och som ska skickas med som en inparameter till denna metod.
            */
            
Console.WriteLine("Which animal do you want to feed?");
            
Console.WriteLine("Dog,Cat or Puppy?");
            
string AnimalChoise Console.ReadLine();
            
AnimalList.Add(new Dog("Dogge"5));
            
AnimalList.Add(new Cat("Kitty"10));
            
AnimalList.Add(new Puppy(2));
           
            if (
AnimalChoise.Equals("Dog"))
            {
               
AnimalList[0].FavFood "Pizza";
                
AnimalList[0].Eat("Pizza");
            }
            if (
AnimalChoise.Equals("Cat"))        //Vet att detta säkert ser jättedumt ut men hur gör jag?
            
{
                     
AnimalList[1].FavFood "Fish";
                
AnimalList[1].Eat("Pizza");
            }  
            if (
AnimalChoise.Equals("Puppy"))
            {
                
AnimalList[0].FavFood "Hamburger";
                
AnimalList[0].Eat("Fish");
            }
        }


De jag vill göra är då att sätta en favoriträtt på varje djur och sen skicka in en inparameter i Eatt(//favoriträtt) och jämföra den med djurets favoritmat och beroende på så löser metoden Hungry_Animals de med olika utskrifter! 

Om jag förklarat luddigt be mig förklara mera:) 

Mycket tacksam för hjälp! Vore guldvärt<3

Vad är problemet då? Är det
Citat:
De jag vill göra är då att sätta en favoriträtt på varje djur och sen skicka in en inparameter i Eatt(//favoriträtt) och jämföra den med djurets favoritmat och beroende på så löser metoden Hungry_Animals de med olika utskrifter!
Som är problemet?

Din eat-metod ser skitkonstig ut, du skickar in nåt slags food, men det använder du aldrig sedan utan du anropar ytterligare en metod utan parametrar där, vad var tanken me det?

Du behöver nog se över designen på den där klassen rejält överlag. En sak är ju att varje animal ska kunna ha olika attribut (längd, vikt, skostorlek), men var ska det avgöras om djuret får sitt favoritkäk eller ej? Det måste du ju rimligen göra i nån av subklasserna, så du bör ju skapa en abstrakt metod i baklassen som heter typ Eat, som varje subklass sedan får implementera. I den kan du sedan avgöra om varje djur har fått sitt favvokäk.
__________________
Senast redigerad av Proton 2018-04-12 kl. 19:27.
Citera
2018-04-12, 19:28
  #3
Medlem
DigiFlaxs avatar
För det första så är det ologiskt att skapa djur och sätta favoriträtter i Feed(). Gör det i lämplig constructor ist.
Citera
2018-04-13, 15:24
  #4
Medlem
Citat:
Ursprungligen postat av Proton
Vad är problemet då? Är det

Som är problemet?

Din eat-metod ser skitkonstig ut, du skickar in nåt slags food, men det använder du aldrig sedan utan du anropar ytterligare en metod utan parametrar där, vad var tanken me det?

Du behöver nog se över designen på den där klassen rejält överlag. En sak är ju att varje animal ska kunna ha olika attribut (längd, vikt, skostorlek), men var ska det avgöras om djuret får sitt favoritkäk eller ej? Det måste du ju rimligen göra i nån av subklasserna, så du bör ju skapa en abstrakt metod i baklassen som heter typ Eat, som varje subklass sedan får implementera. I den kan du sedan avgöra om varje djur har fått sitt favvokäk.

Dehär är uppgiften, kanske allt blir klarare då!
Men jag är klar med menyn och att lista ut djuren.
Bara feed som är kvar

Petowner
Denna klass används för att skapa en husse, det villa säga ”Joppe”.
Joppe har en ålder (-age : int) samt äger en eller flera djur (pets: List<animal>) som då lagras
i en lista.
Med fördel får Joppe att antal djur när programmet startar.
Från listan av djur kan Joppe ”leka med” djuren genom att anropa metoden ”Interact()” i
animal-klassen.
Exempelvis:
pets[2].interact();
Detta görs i metoden Play()


I metoden menu() visas då en meny med olika valmöjligheter och som är kopplat till
metoder enligt följande:
1. Play fetch (metoden Play)
2. Feed Animal (metoden Feed)
3. List animals (metoden list_animals)
Här kommer en beskrivning av dessa metoder:
Play()
Denna metod frågar användaren vilket djur som Joppe ska leka med och därefter anropar
metoden Interact() i det djurobjektet.
Feed()
Denna metod frågar användaren vilket djur som Joppe ska mata och därefter anropa det
djurobjektets metod för detta (eat()). Denna metod hanterar också vilken mat som Joppe
ska mata hunden med och som ska skickas med som en inparameter till denna metod.
List_animals()
Denna metod listar helt enkelt djuren på ett lämpligt sätt genom att skriva ut var och en av
djur-objekten.
Animal
Klassen animal är en abstrakt klass. I denna klass finns flera fält definierade plus tre stycken
metoder.
Fälten är rätt självbeskrivande.
 Age: Hur gammal djuret är
 Name: Djurets namn
 Fav_food: Djurets favoritmat som beskrivs med en vanlig sträng
 Breed: Djurets ras
 Hungry: Sant eller falskt för om djuret är hungrigt
Metoden Interact() innebär att djuret leker med djurägaren (Joppe). Detta förmedlas med
en lämplig utskrift.
Om djuret är hungrigt så vill inte djuret leka utan klagar istället.
Metoden eat() tar emot en sträng och jämför denna mot djurets favoritmat. Om djuret får
sin favoritmat så äter djuret upp maten och blir därefter mätt (#hungry : bool). Får inte
djuret sin favoritmat så finns en metod som styr vad djuret gör om djuret är hungrigt
(+hungry_animal()).
Som standard kommer djuret ”gny” och klaga på att djuret inte får någon mat.
Denna metod anropas om djuret inte får sin favoritmat ovan.
Favorit-mat sätts i respektive underklass och som är lämpligt för djuret.


Cat
Klassen cat ärver från animal.
Det som skiljer denna klass från den generiska animal-klassen är metoden hungry_animal()
som därmed ska ha en ”override”. Om katten inte får sin favoritmat så går han på egen hand
ut och jagar en mus. Lämplig text skrivs ut i konsollen som bekräftar detta.
Det är 50% chans att katten hittar en mus och blir mätt, annars är katten fortfarande
hungrigt.
Utöver detta kan texten för interact() ändras eftersom katten leker annorlunda än hundar.
Dog
Klassen dog ärver från animal
Denna klass skiljer inte från den abstrakta klassen Animal
Puppy
Klassen puppy ärver från dog
Puppy skiljer sig från klassen hund då den har ytterligare ett fält för hur många månader
gammal valpen är. Åldern i år ska sättas till noll (0)
Citera
2018-04-13, 19:07
  #5
Medlem
tj.s avatar
Varför heter klassen Animals när den bara är en representation av ett djur? Varför innehåller Animals, som är en abstrakt klass, rena funktioner istället för att diktera vad klasser som ärver den ska implementera? Varför har du en massa fields när du egentligen kan använda auto-properties då dina properties ändå inte innehåller någon logik?

Jag förstår inte riktigt tanken med koden som är i Feed()-metoden. Varför ska någon annan bestämma vad ett visst djurs föda är? Är det inte respektive djurtyp som ska hålla koll på det? Som i koden nedan.
Kod:
public abstract class Animal
{
    public abstract 
string PreferedFood get; }
}

public class 
Duck Animal
{
    public 
override string PreferedFood => "Grass";
}

public class 
Dog Animal
{
    public 
override string PreferedFood => "Meat";

Enkelt körbart exempel: https://dotnetfiddle.net/pa384Z
Citera
2018-04-14, 11:35
  #6
Medlem
Citat:
Ursprungligen postat av tj.
Varför heter klassen Animals när den bara är en representation av ett djur? Varför innehåller Animals, som är en abstrakt klass, rena funktioner istället för att diktera vad klasser som ärver den ska implementera? Varför har du en massa fields när du egentligen kan använda auto-properties då dina properties ändå inte innehåller någon logik?

Jag förstår inte riktigt tanken med koden som är i Feed()-metoden. Varför ska någon annan bestämma vad ett visst djurs föda är? Är det inte respektive djurtyp som ska hålla koll på det? Som i koden nedan.
Kod:
public abstract class Animal
{
    public abstract 
string PreferedFood get; }
}

public class 
Duck Animal
{
    public 
override string PreferedFood => "Grass";
}

public class 
Dog Animal
{
    public 
override string PreferedFood => "Meat";

Enkelt körbart exempel: https://dotnetfiddle.net/pa384Z


True true true ska kicka på dedär! Tagit bort alla properties och istället gjort autoproperties nu sen varför klassen heter Animals är för att på UMLet jag ska koda efter så stod de att klassen skulle heta så..
Citera
2018-04-14, 12:52
  #7
Medlem
tj.s avatar
Citat:
Ursprungligen postat av Douknowme
True true true ska kicka på dedär! Tagit bort alla properties och istället gjort autoproperties nu sen varför klassen heter Animals är för att på UMLet jag ska koda efter så stod de att klassen skulle heta så..
Ok, så bra. Mitt första stycke var främst för att din kod ska bli mer läsbar för både dig själv som oss som försöker hjälpa dig. Förstår du mitt andra stycke gällande arv och användandet av nyckelordet abstract? Anledningen till varför du vill deklarera metoder och properties i din basklass som abstract är att det tvingar alla underklasser att implementera dessa. Vilket innebär att din basklass fungerar som ett interface medan det låter respektive underklass ta hand om själva implementationen av interfacet.

Ponera att du har en dator. En dator måste kunna ge den som använder den information om RAM-minnens hastighet. Där vill du inte behöva skriva en helt ny datorklass för varje gång ett nytt slags minneskort dyker upp på marknaden. Istället låter du datorn implementera ett interface, i det här fallet basklassen Memory, som specar vad alla minneskort ska implementera. Det innebär att du inte behöver modifiera Computer när ett nytt minneskort dyker upp.
Kod:
public class Program
{
    public static 
void Main()
    {
        var 
lowEndComputer = new Computer(new DDR1());
        var 
midEndComputer = new Computer(new DDR2());
        var 
highEndComputer = new Computer(new DDR3());
        
        var 
computers = new List<Computer> { lowEndComputermidEndComputerhighEndComputer };
        foreach (var 
computer in computers)
        {
            
Console.WriteLine(computer.MemorySpeed);
        }
    }
}

public class 
Computer 
{
    private 
readonly Memory _memory;
    
    public 
Computer(Memory memory)
    {
        
_memory memory;
    }
    
    public 
int MemorySpeed => _memory.SpeedInMhz;
}

public abstract class 
Memory
{
    public abstract 
int SpeedInMhz get; }
}

public class 
DDR1 Memory
{
    public 
override int SpeedInMhz => 100;
}

public class 
DDR2 Memory
{
    public 
override int SpeedInMhz => 1000;
}

public class 
DDR3 Memory
{
    public 
override int SpeedInMhz => 5000;

Körbart exempel: https://dotnetfiddle.net/R0Ex7B

Din uppgift är väldigt enkel. Följ bara det jag förklarade och applicera det på dina djur så som det är beskrivet i uppgiften.
Citera
2018-04-15, 18:37
  #8
Medlem
Citat:
Ursprungligen postat av tj.
Ok, så bra. Mitt första stycke var främst för att din kod ska bli mer läsbar för både dig själv som oss som försöker hjälpa dig. Förstår du mitt andra stycke gällande arv och användandet av nyckelordet abstract? Anledningen till varför du vill deklarera metoder och properties i din basklass som abstract är att det tvingar alla underklasser att implementera dessa. Vilket innebär att din basklass fungerar som ett interface medan det låter respektive underklass ta hand om själva implementationen av interfacet.

Ponera att du har en dator. En dator måste kunna ge den som använder den information om RAM-minnens hastighet. Där vill du inte behöva skriva en helt ny datorklass för varje gång ett nytt slags minneskort dyker upp på marknaden. Istället låter du datorn implementera ett interface, i det här fallet basklassen Memory, som specar vad alla minneskort ska implementera. Det innebär att du inte behöver modifiera Computer när ett nytt minneskort dyker upp.
Kod:
public class Program
{
    public static 
void Main()
    {
        var 
lowEndComputer = new Computer(new DDR1());
        var 
midEndComputer = new Computer(new DDR2());
        var 
highEndComputer = new Computer(new DDR3());
        
        var 
computers = new List<Computer> { lowEndComputermidEndComputerhighEndComputer };
        foreach (var 
computer in computers)
        {
            
Console.WriteLine(computer.MemorySpeed);
        }
    }
}

public class 
Computer 
{
    private 
readonly Memory _memory;
    
    public 
Computer(Memory memory)
    {
        
_memory memory;
    }
    
    public 
int MemorySpeed => _memory.SpeedInMhz;
}

public abstract class 
Memory
{
    public abstract 
int SpeedInMhz get; }
}

public class 
DDR1 Memory
{
    public 
override int SpeedInMhz => 100;
}

public class 
DDR2 Memory
{
    public 
override int SpeedInMhz => 1000;
}

public class 
DDR3 Memory
{
    public 
override int SpeedInMhz => 5000;

Körbart exempel: https://dotnetfiddle.net/R0Ex7B

Din uppgift är väldigt enkel. Följ bara det jag förklarade och applicera det på dina djur så som det är beskrivet i uppgiften.


De jag inte förstår är att på umlet står de att jag bara ska ha in på tex vi tar Dog. Dogs konstruktor ska ha in 2 parametrar. En string name och en int age.
Men sen då jag ska lista ut Dog vill jag ha med både ras favoritmat. Hur gör jag de? För nu ser de ut såhär!

Kod:
public void Play()
        {

            
/*Denna metod frågar användaren vilket djur som Joppe ska leka med och därefter anroparmetoden Interact() i det djurobjektet. */
            
Console.WriteLine("Which animal do you want to play with?");
            
Console.WriteLine("Dog,Cat or Puppy?");
            
string AnimalChoise Console.ReadLine();
            
AnimalList.Add(new Dog("Dogge"5));
            
AnimalList.Add(new Cat("Kitty"10));
            
AnimalList.Add(new Puppy(2));

            if (
AnimalChoise.Equals("Dog"))
            {
                
AnimalList[0].Interact();
            }
            if (
AnimalChoise.Equals("Cat"))
            {
                
AnimalList[1].Interact();
            }
            if (
AnimalChoise.Equals("Puppy"))
            {
                
AnimalList[2].Interact();
            }         
        } 
Citera
2018-04-15, 19:37
  #9
Medlem
tj.s avatar
Citat:
Ursprungligen postat av Douknowme
De jag inte förstår är att på umlet står de att jag bara ska ha in på tex vi tar Dog. Dogs konstruktor ska ha in 2 parametrar. En string name och en int age.
Men sen då jag ska lista ut Dog vill jag ha med både ras favoritmat. Hur gör jag de? För nu ser de ut såhär!

Kod:
public void Play()
        {

            
/*Denna metod frågar användaren vilket djur som Joppe ska leka med och därefter anroparmetoden Interact() i det djurobjektet. */
            
Console.WriteLine("Which animal do you want to play with?");
            
Console.WriteLine("Dog,Cat or Puppy?");
            
string AnimalChoise Console.ReadLine();
            
AnimalList.Add(new Dog("Dogge"5));
            
AnimalList.Add(new Cat("Kitty"10));
            
AnimalList.Add(new Puppy(2));

            if (
AnimalChoise.Equals("Dog"))
            {
                
AnimalList[0].Interact();
            }
            if (
AnimalChoise.Equals("Cat"))
            {
                
AnimalList[1].Interact();
            }
            if (
AnimalChoise.Equals("Puppy"))
            {
                
AnimalList[2].Interact();
            }         
        } 
Det är inga problem att en subklass har fler parametrar i din konstruktor än sin basklass.
Kod:
public abstract class Animal 
{
    public 
string Name getset; }
    
    public 
Animal(string name)
    {
        
Name name;
    }
}

public class 
Dog Animal
{
    public 
int Age getset; }
    
    public 
Dog(string nameint age) : base(name)
    {
        
Age age;
    }

Citera
2018-04-15, 20:13
  #10
Medlem
Citat:
Ursprungligen postat av tj.
Det är inga problem att en subklass har fler parametrar i din konstruktor än sin basklass.
Kod:
public abstract class Animal 
{
    public 
string Name getset; }
    
    public 
Animal(string name)
    {
        
Name name;
    }
}

public class 
Dog Animal
{
    public 
int Age getset; }
    
    public 
Dog(string nameint age) : base(name)
    {
        
Age age;
    }


Ah alright men då gör jag såhär!

Kod:
public Dog(string nameint age,string breedstring favfood)  //Dogs konstruktor 
        
{
            
this.fav_food fav_food;
            
this.breed breed;
            
this.name name;
            
this.age age;
        } 
Citera
2018-04-15, 20:21
  #11
Medlem
tj.s avatar
Citat:
Ursprungligen postat av Douknowme
Ah alright men då gör jag såhär!

Kod:
public Dog(string nameint age,string breedstring favfood)  //Dogs konstruktor 
        
{
            
this.fav_food fav_food;
            
this.breed breed;
            
this.name name;
            
this.age age;
        } 
Varför sätter du matpreferens i konstruktorn? Det står ju i din uppgift att respektive underklass ska hantera det själv - vilket jag också vid flera gånger nu har visat hur man gör.
Favorit-mat sätts i respektive underklass och som är lämpligt för djuret
Citera
2018-04-16, 16:08
  #12
Medlem
Citat:
Ursprungligen postat av tj.
Det är inga problem att en subklass har fler parametrar i din konstruktor än sin basklass.
Kod:
public abstract class Animal 
{
    public 
string Name getset; }
    
    public 
Animal(string name)
    {
        
Name name;
    }
}

public class 
Dog Animal
{
    public 
int Age getset; }
    
    public 
Dog(string nameint age) : base(name)
    {
        
Age age;
    }


Så jag behöver alltså en Animal konstruktor eller?


Kod:
Tänker jag fel nu kanske?

abstract class 
Animals
    
{
       public 
Animals(string name,string breed,string favfood)
        {
            
this.name name;
            
this.breed breed;
            
this.fav_food favfood;
        }

class 
Dog Animals
    
{
        public 
Dog(string nameint age,string fav_food,string breed) :base(name,breed,fav_food)
       {
            
this.age age;         
        } 
__________________
Senast redigerad av Douknowme 2018-04-16 kl. 16:12.
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback