Avatar billede mosquito Nybegynder
07. september 2005 - 21:54 Der er 12 kommentarer og
1 løsning

arv og interface - hvordan?

abstract class HotDrink
{
  public abstract void AddMilk()
}

public interface ICup
{
  void Wash()
}

public class Chokolate : HotDrink, ICup
{
  // from abstract class
  public void AddMilk() {do something}

  // from interface
  public void Wash()    {do something}
}

public class Run()
{
  public static void Main(string[] args)
  {
    Chokolote chokolate = new Chokolate();
    chokolate.AddMilk()        // OK
    chokolate.Wash();          // OK

    HotDrink drink;
    drink = new Chokolate();
    drink.AddMilk();          // OK
    drink.Wash();              // NOT ACCESSIBLE
  }
}

Hvorfor kan jeg ikke gøre det?  Ifølge lærebogen (beginning Visual C#) skal jeg komme frem til denne løsning:

public void function(HotDrink drink)
{
    drink.AddMilk();
    drink.Wash();      // metode fra interface ICup til Chokolate
}

Hvor knækker filmen??
Avatar billede arne_v Ekspert
07. september 2005 - 21:59 #1
hvordan får du

public class Run()
{

til at compile ?
Avatar billede softspot Forsker
07. september 2005 - 21:59 #2
Mangler du ikke en override i denne

public void AddMilk() {do something}

altså

public override void AddMilk() {do something}
Avatar billede arne_v Ekspert
07. september 2005 - 22:00 #3
det er ret vigtigt at koden er præcis den du forsøger at compile og at der kun
er de fejl du spørger om
Avatar billede softspot Forsker
07. september 2005 - 22:01 #4
Næh, der er nok ikke det der er galt...
Avatar billede mosquito Nybegynder
07. september 2005 - 22:12 #5
Her følger den originale kode, ovenstående kan jeg godt se ikke er fyldestgørende.

HotDrink.cs

using System;

namespace exercise
{
    /// <summary>
    /// Summary description for HotDrink.
    /// </summary>
    public abstract class HotDrink
    {
        protected bool milk;
        protected bool sugar;

        public abstract void Drink();
        public abstract void AddMilk();
        public abstract void AddSugar();

        public abstract bool Milk{ get; set;}
        public abstract bool Sugar{ get; set;}
       
    }
}


ICup.cs

using System;

namespace exercise
{
    /// <summary>
    /// Summary description for ICup.
    /// </summary>
    public interface ICup
    {
        void Refill();
        void Wash();

        string Color{set; get;}
        string Volume{set; get;}
    }
}


CupOfChokolate.cs

using System;

namespace exercise
{
    public class CupOfChokolate : HotDrink, ICup
    {
        #region HotDrink Members
        public override bool Milk
        {
            get
            {
                return milk;
            }
            set
            {
                milk = value;
            }
        }

        public override bool Sugar
        {
            get
            {
                return sugar;
            }
            set
            {
                sugar = value;
            }
        }


        public override void Drink()
        {

        }
        public override void AddMilk()
        {
            Milk = true;
        }
        public override void AddSugar()
        {
            Sugar = true;
        }


        #endregion

        #region ICup Members
        public string color;
        public string volume;

        public void Refill()
        {
            Console.WriteLine("CupOfChokolate is now refilled!!");;
        }

        public void Wash()
        {
            Console.WriteLine("CupOfChokolate is now cleaned!!");;
        }


        public string Color
        {
            get
            {
                return color;
            }
            set
            {
                color = value;
            }
        }

        public string Volume
        {
            get
            {
                return volume;
            }
            set
            {
                volume = value;
            }
        }
        #endregion
    }
}


Start.cs

using System;

namespace exercise
{
    class Start
    {
        private static void function(HotDrink drink)
        {
            drink.AddMilk();
            drink.Drink();
            drink.Wash();
        }

        [STAThread]
        static void Main(string[] args)
        {
            HotDrink drink;
            drink = new CupOfChokolate();
            function(drink);
        }
    }
}

Ved at eksekvere får jeg en fejl, som er ret logisk.. nemlig at Wash() ikke er en metode på HotDrink... men opgaven lyder nemlig at dette ikke er tilfældet og jeg skal kunne afvikle en metode der tager en HotDrink som parameter og kan afvikle bla. AddMilk() og Wash() på instanser af en hvilken som helst drink.. chokolate i nærværende situation.. har dog flere klasser sidestillet med chokolate som ligeledes arver fra HotDrink og implementere interfaces ICup. disse er dog ikke med af hensyn til overskueligheden.
Avatar billede arne_v Ekspert
07. september 2005 - 22:16 #6
som du selv skriver er det jo meget logisk

du kan ikke kalde Wash på en vilkårlig HotDrink
Avatar billede mosquito Nybegynder
07. september 2005 - 22:20 #7
ved nærlæsning af opgaven står der nu heller ikke at jeg skal tage en HotDrink som parameter, men at jeg skal kunne tage en hvilken som helst drink.. ex Chokolate... og afvikle ovenstående metoder..

arne v> tak for dit konkrete svar. Det ledte mig til løsningen. Send venligst svar, dine point er fortjent.
Avatar billede arne_v Ekspert
07. september 2005 - 22:22 #8
ok
Avatar billede mosquito Nybegynder
07. september 2005 - 22:25 #9
endnu en gang tak.
Avatar billede akempff Nybegynder
08. september 2005 - 00:26 #10
For lige at være med her, er det fordi man ikke kan lave instanser af en abstrakt klasse?
Avatar billede arne_v Ekspert
08. september 2005 - 07:47 #11
næh

men Wash er i ICup

og at arve fra HotDrink er ikke nok til at garantere at man også arver fra ICup
og derfor can Wash ikke kaldes på en HotDrink
Avatar billede akempff Nybegynder
08. september 2005 - 08:05 #12
Ah. Det kan jeg godt se. Tak Arne.
Avatar billede mosquito Nybegynder
08. september 2005 - 18:27 #13
Jeg kunne jo godt lige vedlægge løsningen, såfremt den kan være brugbar for andre.

namespace exercise
{
    class Start
    {
        private static void function(HotDrink drink)
        {
            drink.AddMilk();
            drink.Drink();
            ICup hotDrink = (ICup) drink;
            hotDrink.Wash();
        }

        [STAThread]
        static void Main(string[] args)
        {
            HotDrink drink;
            drink = new CupOfChokolate();
            function(drink);
        }
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester