Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41

Применение интерфейса

14.05.2013, 18:03. Показов 1473. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть код

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
public class Product {
public int ProductID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { set; get; }
}
public interface IValueCalculator {
decimal ValueProducts(params Product[] products);
}
public class LinqValueCalculator : IValueCalculator {
public decimal ValueProducts (params Product[] products) {
return products.Sum (p => p.Price); }
}
public class ShoppingCart
{
    private IValueCalculator calculator;
    public ShoppingCart(IValueCalculator calcParam)
    {
        calculator = calcParam;
    }
    public decimal CalculateStockValue()
    {
        // Определение набора товаров для суммирования
        Product[] products = {
   new Product () { Name = "Kayak", Price = 275M},
    new Product() { Name = "Lifejacket", Price = 48.95M },
     new Product () { Name = "Soccer ball", Price = 19.50M },
      new Product () { Name = "Stadium", Price = 79500M }
   };
        // Вычисление общей стоимости товаров
        decimal totalValue = calculator.ValueProducts(products);
        // Возврат результата
        return totalValue;
        
    }
}
17-22, 32 строчки.
Объясните плиз, зачем нам создавать calculator типа IValueCalculator ( что нам это даёт ? )
и зачем создавать public ShoppingCart, который берёт в качестве параметра любой объект типа IValueCalculator, если мы его нигде не используем. Судя по логике кода, мы Интерфейсу присвоили значение объекта интерфейса, как так?
как по имени calculator мы вызвали в нем метод ValueProduct? почему нельзя было вместо calculator просто использовать "IValueCalculator"? если они оба одного и того же типа
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2013, 18:03
Ответы с готовыми решениями:

Применение графического интерфейса в Scilab
Что означает строчка:tet_in=uicontrol(frame,'style','text','string','$\tau=$','position',,'fontsize',18);в программе Scilab?

Применение интерфейса Multiset классом HashMultiset
Здравствуйте Пытаюсь самообучаться через интернет(hyperskill.org) Застопорился на задании: Дан интерфейс Multiset, примените...

Как увидеть методы в классах, которые реализованы из интерфейса и перейти в них из интерфейса?
Как увидеть методы класса, которые реализованы из интерфейса и перейти в них из этого интерфейса, то есть все классы где данный метод...

15
713 / 680 / 126
Регистрация: 30.03.2012
Сообщений: 1,124
14.05.2013, 18:35
учитывая что у вас ОДИН класс реализует интерфейс то да, разницы между интерфейсом и тем что вы напишете прямо в классе никакой
однако, представьте на секунду что вам нужен еще один класс с этими же методами но реализованными абсолютно по другому
а классу ShoppingCard должно быть строго фиолетово на конкретную реализацию - он просто вызывает метод, определенный в интерфейсе

в случае интерфейса вы можете использовать разные классы реализующие его в разных экземплярах ShoppingCard, в случае если интерфейса не будет вам понадобится для двух классов калькулятора два класса ShoppingCard (или абстрактный класс от которого будут наследоваться калькуляторы)
0
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
14.05.2013, 19:00  [ТС]
Цитата Сообщение от Tessen Посмотреть сообщение
учитывая что у вас ОДИН класс реализует интерфейс то да, разницы между интерфейсом и тем что вы напишете прямо в классе никакой
однако, представьте на секунду что вам нужен еще один класс с этими же методами но реализованными абсолютно по другому
а классу ShoppingCard должно быть строго фиолетово на конкретную реализацию - он просто вызывает метод, определенный в интерфейсе
Ну, допустим у меня несколько классов, реализующих этот интерфейс абсолютно по разному, тогда какой же метод вызовется по этому имени: calculator.ValueProducts() ? ( Зависит от параметра и типа возвращ. значения ? )

Цитата Сообщение от Tessen Посмотреть сообщение
в случае интерфейса вы можете использовать разные классы реализующие его в разных экземплярах ShoppingCard, в случае если интерфейса не будет вам понадобится для двух классов калькулятора два класса ShoppingCard (или абстрактный класс от которого будут наследоваться калькуляторы)
Вот тут можно немножко разжевать если возможно? не совсем въезжаю
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
14.05.2013, 19:33
Вот смотри - у тебя есть три класса: Книжки (class Book), Покупатели (class Buyer) и Работники (class Workers). На основе этих классов ты можешь создать массив списков

C#
1
2
3
Book[] list1;
Buyer[] list2;
Workers list3;
И скажем, нам нужно хранить всё это добро в одном файлах. Причем - текстовых (в жизни так не делайте!). Естественно, придется написать функции чтения/записи, а также перевода из строки в объект и обратно. Так вот - интерфейс позволит нам написать одну единственную функцию для записи в файл, а не дублировать её три раза.

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
interfase MyInterface
{
  string InString();
}
 
class Book : MyInterface
    {
        public string InString()
        {
            return "book";
        }
    }
 
void ReadToFile(string file, MyInterface list[])
{
  StreamWrite stream = System.IO.File.AppendText(file);
  for (int i = 0; i < list.Length; i++)
  {
    stream.WrileLine(str = list[i].InString();
  }
}
 
 
//и где-то дальше у нас записывается список книг
ReadToFile("book.txt", list1);
0
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
15.05.2013, 11:41  [ТС]
C#
1
stream.WrileLine(str = list[i].InString();
Вот эту запись можно поподробней?, Почему метод InString возвращает строку "book", что запишется в файл при выполнении команды
C#
1
stream.WrileLine(str = list[i].InString()
Получается в каждом классе, напридется реализовать интерфейс по-своему? гдето Instring возвращает book, а гдето Workers?
0
Заблокирован
15.05.2013, 13:00
Цитата Сообщение от Wolfdp Посмотреть сообщение
Так вот - интерфейс позволит нам написать одну единственную функцию для записи в файл, а не дублировать её три раза.
Да ладно
Можно пожалуйста примерчик. Где у вас будет интерфейс в нем функция, которую потом не надо будет во всех классах писать.
0
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
15.05.2013, 13:30  [ТС]
Цитата Сообщение от Skostians Посмотреть сообщение
Да ладно
Можно пожалуйста примерчик. Где у вас будет интерфейс в нем функция, которую потом не надо будет во всех классах писать.
Если вы поняли код из 1 поста пожалуйста объясните суть 17-23 строк ))
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
15.05.2013, 14:18
Цитата Сообщение от Skostians Посмотреть сообщение
Да ладно
Можно пожалуйста примерчик. Где у вас будет интерфейс в нем функция, которую потом не надо будет во всех классах писать.
Я имел ввиду, что нам не придется дублировать функцию void ReadToFile(string file, MyInterface list[]) три раза для всех классов.
0
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
15.05.2013, 14:46  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Я имел ввиду, что нам не придется дублировать функцию void ReadToFile(string file, MyInterface list[]) три раза для всех классов.
имеется ввиду писать void ReadToFile(string file, MyInterface list1[]) void ReadToFile(string file, MyInterface list2[])?

так а почему не придется? объясните плиз, не понятно же, и тем более не понятно, зачем нам .ToString() если она возвращает "book"
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
15.05.2013, 15:30
Цитата Сообщение от Listorat Посмотреть сообщение
имеется ввиду писать void ReadToFile(string file, MyInterface list1[]) void ReadToFile(string file, MyInterface list2[])?
Имеется ввиду

C#
1
2
3
4
ReadToFile(string file, Book[] list) 
{}
void ReadToFile(string file, Buyer[] list)
{}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.05.2013, 16:20
Listorat, вот вам пример, может по нему поймете
http://blog.byndyu.ru/2009/12/... ZN9WMorh-A

А лучше прочитайте всю серию принципов solid:
http://blog.byndyu.ru/2009/10/... ZN9hsorh-B
0
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
15.05.2013, 16:33  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Имеется ввиду

C#
1
2
3
4
ReadToFile(string file, Book[] list) 
{}
void ReadToFile(string file, Buyer[] list)
{}
ну хорошо, тут допустим понятно, что в зависимости от указываемого в параметре объекта list, будет применяться соответствующий метод InString() (реализованный в каждом классе отдельно). Но Вы про метод InString() объясните плиз, что означает запись

C#
1
stream.WrileLine(str = list[i].InString()
это равносильно stream.WriteLine(str=list[i].book( или Buyer,Worker))?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.05.2013, 16:44
Listorat, ладно, представьте себе, что у нас есть класс птицы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    class Bird
    {
        public readonly string Name;
 
        public Bird(string name)
        {
            Name = name;
        }
 
        public void Fly()
        {
            Console.WriteLine("I CAN FLY!!!");
        }
    }
Теперь мы хотим, чтобы пингвины у нас не могли летать, тогда пишем
C#
1
2
3
4
5
6
7
        public void Fly()
        {
            if (Name == "Penguin")
               Console.WriteLine("I CAN'T FLY!!!");
            else
               Console.WriteLine("I CAN FLY!!!");
        }
Предположим, что теперь нам нужно добавить индейку, она летает, но очень недалеко, тогда мы пишем:
C#
1
2
3
4
5
6
7
8
9
        public void Fly()
        {
            if (Name == "Penguin")
               Console.WriteLine("I CAN'T FLY!!!");
            else if (Name == "Turkey")
               Console.WriteLine("I CAN FLY ON SHORT DISTANCE!!!");
            else
               Console.WriteLine("I CAN FLY!!!");
        }
И так далее, будем множить сущности. А можем сделать так:
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
    interface IFlyBehaviour
    {
        void Fly();
    }
 
    class DefaultFlyBehaviour : IFlyBehaviour
    {
        public void Fly()
        {
            Console.WriteLine("I CAN FLY!!!");
        }
    }
 
    class PenguinFlyBehaviour : IFlyBehaviour
    {
        public void Fly()
        {
            Console.WriteLine("I CAN'T FLY!!!");
        }
    }
 
    class TurkeyFlyBehaviour : IFlyBehaviour
    {
        public void Fly()
        {
            Console.WriteLine("I CAN FLY ON SHORT DISTANCE!!!");
        }
    }
 
    class Bird
    {
        public readonly string Name;
        private readonly IFlyBehaviour flyBehaviour;
 
        public Bird(string name, IFlyBehaviour flyBehaviour)
        {
            Name = name;
            this.flyBehaviour = flyBehaviour;
        }
 
        public Bird(string name) : this(name, new DefaultFlyBehaviour())
        {
            
        }
 
        public void Fly()
        {
            flyBehaviour.Fly();
        }
    }
Конечно, код получился немного длиннее, но это неважно, потому что мы избавились от зависмиостей, если нам нужно добавить еще одну птичку с другим поведением, нам просто нужно будет наследовать другой класс поведения от IFlyBehaviour. Например, если класс Bird библиотечный, вы не можете просто так его перекомпилировать (добавив еще одну ветку else). А таким образом вы можете добавлять сколько угодно поведений для различных классов.
0
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
15.05.2013, 16:44  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Listorat, вот вам пример, может по нему поймете
http://blog.byndyu.ru/2009/12/... ZN9WMorh-A

А лучше прочитайте всю серию принципов solid:
http://blog.byndyu.ru/2009/10/... ZN9hsorh-B
Кажется я врубился, просто пример плохой, не показывает дальнейшее его применение. Значит Создавая любой экземпляр класса ShoppingCart , и указывая в параметрах необходимый нам класс , унаследовавший интерфейс IValueCalculator, он способен вызвать метод CalculateStockValue который в свою очередь вызывает метод ValueProducts, реализованный в классе, который указан в параметре. Тем самым класс ShoppingCart с другими классами никак не связан, и работает с ними исключительно посредством связки интерфейса IValueCalculator?. И вся фишка не в оптимальности, а в том чтобы классы никак друг друга не касались.

Если я ошибся , скажите плз
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
15.05.2013, 16:45
Listorat, ну вот, прекрасно все поняли. Главное не производительность, а косвенность. Слабая связанность - признак хорошей архитектуры. В программировании правило 80/20 выглядит как правило 95/5. То есть 5% кода выполняются 95% времени и наоборот. Поэтому есть смысл писать красивый код везде, а потом только в этих 5% курочить его ради производительности. А где курочить - решит профайлер.
1
1 / 1 / 0
Регистрация: 01.04.2012
Сообщений: 41
15.05.2013, 16:54  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Listorat, ну вот, прекрасно все поняли. Главное не производительность, а косвенность. Слабая связанность - признак хорошей архитектуры. В программировании правило 80/20 выглядит как правило 95/5. То есть 5% кода выполняются 95% времени и наоборот. Поэтому есть смысл писать красивый код везде, а потом только в этих 5% курочить его ради производительности. А где курочить - решит профайлер.
спасибо огромное, я вторые сутки не мог въехать, теперь все понял
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2013, 16:54
Помогаю со студенческими работами здесь

В программе два интерфейса и нужно чтобы при выводе сообщения в тексбоксе 1 интерфейса, текст сразу отображался
в текстбоксе второго интерфейса, никак не могу понять как это сделать

Применение
Возможно вы посчитаете данный вопрос глупым. Но я его задам. Где можно применять C++ и C программисту, при этом не используя GUI? И...

Применение C#
Привет всем! Работаю сис. админом и мне как то надоело хочу уйти в кодеры, мне очень нравиться язык программирования C# в уневери писал на...

применение c++
в 1 семестре начали проходить с++ за сем дошли до указателей (во 2 их начнем) прошли: типы, константы, операции, функции (передача по...

Применение стилей
Здравствуйте!Имеется один общий файл стилей для всех страниц. Нужно, чтобы один и тот же элемент отображался на разных страницах сайта...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru