0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 29
1

Сеть кофейн описывающие кофе. Шаблон декоратор

15.10.2016, 15:49. Показов 1938. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
возникают ошибки в ходе компиляции...боюсь,что начну исправлять сама и код полетит
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace laba3
{
   public class Coffe
    {
      static void Main (string[] args)//
        {Beverage bev=new Espresso();
           bev=new Mocha(bev);
           bev=new Moch(bev);
           Console.WriteLine(bev.getDescription()+"cena"+bev.cost());
           Beverage bev = new Decaf();
           bev = new Decaf(bev);
           bev = new Dec(bev);
           Console.WriteLine(bev.getDescription() + "cena" + bev.cost());
           Beverage bev = new HouseBlend();
           bev = new HouseBlend(bev);
           bev = new House(bev);
           Console.WriteLine(bev.getDescription() + "cena" + bev.cost());
           Beverage bev = new DarkRoast();
           bev = new DarkRoast(bev);
           bev = new darl(bev);
           Console.WriteLine(bev.getDescription() + "cena" + bev.cost());
        }
    }
   public abstract class Beverage
   {
       string description = "neizvest";
       public String getDescription()
       { return description; }
       public abstract double cost();
   }
   public abstract class CondimentDecorator : Beverage
   { public abstract string getDescription();}
 
   
    //описывают дек.объекты
   public class Espresso : Beverage
   {
       public Espresso()
       { description = "Espresso"; }
       public double cost()
       { return 70; }
 
       
   }
   public class HouseBlend : Beverage
   {
       public HouseBlend()
       { description = "HouseBlend"; }
       public double cost()
       { return 82; }
 
       
   }
   public class Decaf : Beverage
   {
       public Decaf()
       { description = "DarkRoast"; }
       public double cost()
       { return 182; }
   }
 
   public class DarkRoast : Beverage
   {
       private string description;
       public DarkRoast()
       { description = "Decaf"; }
       public double cost()
       { return 102; }
   }
 
 
    ///класс декоратор
    ///
   public class Mocha : CondimentDecorator
   {
       Beverage bev;
       public  Mocha(Beverage beverage)
       { this.bev = beverage; }
       public string getDescription()
       { return bev.getDescription() + "c пеной"; }
       public double cost()
       { return 30 + bev.cost(); }
   }
 
 
 
   public class Soy : CondimentDecorator
   {
       Beverage bev;
       public Soy(Beverage beverage)
       { this.bev = beverage; }
       public string getDescription()
       { return bev.getDescription() + "c соей"; }
       public double cost()
       { return 30 + bev.cost(); }
   }
 
   public class Milk : CondimentDecorator
   {
       Beverage bev;
       public Milk(Beverage beverage)
       { this.bev = beverage; }
       public string getDescription()
       { return bev.getDescription() + "c молоком"; }
       public double  cost()
       { return 30 + bev.cost(); }
   }
 
 
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2016, 15:49
Ответы с готовыми решениями:

кофе машина TEKA модель cm381nox s/n 83600811, при включении в сеть моргает индикатор
какая это ошибка https://www.cyberforum.ru/savedimages/2013/01/21/2572350581.jpg

Дана цена 1кг кофе. Вывести на экран стоимость 1.1, 1.2,..,2 кг кофе
Дана цена 1кг кофе. Вывести на экран стоимость 1.1, 1.2,..,2 кг кофе

Кофе с молоком или молоко с кофе?
От полного стакана кофе я отпил половину и долил столько же молока. Затем я отпил третью часть...

Декоратор
Хочу написать шнягу, чтобы выводилось время работы функции... решил сделать с помощью декоратора;...

8
134 / 130 / 107
Регистрация: 17.03.2009
Сообщений: 364
15.10.2016, 17:12 2
Лучший ответ Сообщение было отмечено so_ily как решение

Решение

При перекрытии методов в классах-наследниках надо надо override ставить. В классе Beverage метод getDescription() должен быть объявлен как virtual, а поле description, как protected или internal. Вообще ошибок просто тонна,
- несколько раз подряд объявлять одна и та же локальная переменная
- вызывается конструктор с меньшим числом параметро, чем в нем объявлено
- в классах-наследниках снова объявляются поля, которые уже были объявлены в родителях (description).

Немножко причесал код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace laba3
{
    public class Coffe
    {
        static void Main(string[] args)//
        {
            Beverage bev = new Espresso();
            bev = new Mocha(bev);
            Console.WriteLine(bev.getDescription() + "cena" + bev.cost());
            bev = new Decaf();
            Console.WriteLine(bev.getDescription() + "cena" + bev.cost());
            bev = new HouseBlend();
            Console.WriteLine(bev.getDescription() + "cena" + bev.cost());
            bev = new DarkRoast();
 
            Console.WriteLine(bev.getDescription() + "cena" + bev.cost());
        }
    }
    public abstract class Beverage
    {
        protected string description = "neizvest";
        public virtual String getDescription()
        { return description; }
        public abstract double cost();
    }
    public abstract class CondimentDecorator : Beverage
    {}
 
 
    //описывают дек.объекты
    public class Espresso : Beverage
    {
        public Espresso()
        { description = "Espresso"; }
        public override double cost()
        { return 70; }
 
 
    }
    public class HouseBlend : Beverage
    {
        public HouseBlend()
        { description = "HouseBlend"; }
        public override double cost()
        { return 82; }
 
 
    }
    public class Decaf : Beverage
    {
        public Decaf()
        { description = "DarkRoast"; }
        public override double cost()
        { return 182; }
    }
 
    public class DarkRoast : Beverage
    {
        
        public DarkRoast()
        { description = "Decaf"; }
        public override double cost()
        { return 102; }
    }
 
 
    ///класс декоратор
    ///
    public class Mocha : CondimentDecorator
    {
        Beverage bev;
        public Mocha(Beverage beverage)
        { this.bev = beverage; }
        public override string getDescription()
        { return bev.getDescription() + "c пеной"; }
        public override double cost()
        { return 30 + bev.cost(); }
    }
 
 
 
    public class Soy : CondimentDecorator
    {
        Beverage bev;
        public Soy(Beverage beverage)
        { this.bev = beverage; }
        public override string getDescription()
        { return bev.getDescription() + "c соей"; }
        public override double cost()
        { return 30 + bev.cost(); }
    }
 
    public class Milk : CondimentDecorator
    {
        Beverage bev;
        public Milk(Beverage beverage)
        { this.bev = beverage; }
        public override string getDescription()
        { return bev.getDescription() + "c молоком"; }
        public override double cost()
        { return 30 + bev.cost(); }
    }
 
 
 
}
1
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 29
15.10.2016, 17:40  [ТС] 3
mishau, спасибо большое) насчет override поняла сама) и еще вопросик, если я хочу вывести эспрессо с молоком, потом эспрессо с соей или все вместе, то получается какая то ерунда
Миниатюры
Сеть кофейн описывающие кофе. Шаблон декоратор  
0
134 / 130 / 107
Регистрация: 17.03.2009
Сообщений: 364
15.10.2016, 19:41 4
Ну примерно так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Console.WriteLine((new Mocha( new Espresso() )).getDescription()); // с пеной
Console.WriteLine((new Milk( new Espresso())).getDescription()); // с молоком
Console.WriteLine((new Soy( new Espresso())).getDescription()); // с соей
 
 
var beverage = new Soy
(
    new Milk 
    (
        new Mocha( new Espresso() )
    )
);
 
Console.WriteLine(beverage.getDescription()); //со всем вместе
Так работают декораторы.

Добавлено через 53 минуты
Рекомендую вот эту книгу почитать: Эрик Фримен, Элизабет Фримен. Паттерны проектирования

Там про пиццу похожая задача разбирается.
1
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 29
19.10.2016, 18:33  [ТС] 5
mishau, теперь не выводится цена( за книгу спасибо, почитаю, может чему-нибудь научусь
0
134 / 130 / 107
Регистрация: 17.03.2009
Сообщений: 364
19.10.2016, 18:48 6
Так она же не прописана в getDescription.

Замените в последних классах таким образом:

C#
1
return bev.getDescription() + " c пеной " + bev.cost;
и так далее для всех
0
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 29
19.10.2016, 20:50  [ТС] 7
mishau, Ошибка 1 Оператор "+" не может применяться к операндам типа "string" и "группа методов"
0
134 / 130 / 107
Регистрация: 17.03.2009
Сообщений: 364
19.10.2016, 21:24 8
Перепишите, как bev.getDescription() + " cena "+Convert.ToString(bev.cost());
1
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 29
21.10.2016, 12:48  [ТС] 9
mishau, спасибо большое))очень помогли)))
0
21.10.2016, 12:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2016, 12:48
Помогаю со студенческими работами здесь

Декоратор
Не могу понять зачем использовать в декораторах from functool import wraps вот пример с @wraps и...

Декоратор
function spy(func) { function wrapper(...args) { wrapper.calls.push(args); ...

Декоратор(паттерн)
Привет, у меня есть вектор std::vector<cShape*> figures; помещаю в него 2 квадрата cShape*...

Паттерн декоратор
доброго времени суток уважаемые форумчане, помогите пожалуйста разобраться, где я допустил ошибку? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru