Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2018, 17:27   #41
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Ох, ну не знаю. На логгировании я бы тоже, наверное, не поняла.

Интерфейсы нужны для вычленения общих признаков. Например, издавать звуки умеет человек и собака. Вы обоим классам пишите метод ИздаватьЗвуки - и радуетесь. Представьте, что 100 человек и 100 собак собрались в одной комнате и хотят "поговорить".

Какое первое решение? Создать массив люди и массив собаки, прокрутить каждый в цикле и вызвать ИздаватьЗвуки у каждого элемента. А теперь представим, что у нас есть еще попугайчики, кролики, кошки, бегемоты, слонопотамы. Это ж сколько придется делать массивов, чтобы у всех повызывать функцию ИздаватьЗвуки? А если каждые два дня заказчик добавляет еще одного животного, вам придется каждые два дня переписывать код, добавляя массив?

Дальше мы должны понять, что нам не мешало бы иметь всего один массив на всех издающих звуки. Но мы не можем засунуть в один массив разные типы данных. Мы вспоминаем, что есть наследование и создаем класс ИздающиеЗвуки, от которого наследуем наших кошек-собак-человеков и т.д. Итак, у нас есть один массив на всех, нам не страшно добавление новых элементов.

Но приходит заказчик и говорит, хочу, мол, чтобы наши объекты пошли на стадион и попрыгали. Там вы уже сразу понимаете, что нужен один массив для всех. Только беда какая: прыгать наши зверушки не умеют. Вы такой: "Да не вопрос!" Создаете класс Прыгающие, описываете там функцию Прыгать и намереваетесь унаследовать от него наших кошек-собак, а Шарп вам говорит: "Нифига, друг, у меня нет множественного наследования, а твои зверушки уже унаследованы от класса ИздающиеЗвуки! Зато я могу имплементировать множество интерфейсов".

И на этом этапе у вас уже должна появиться мысль, что ИздающиеЗвуки и Прыгающие - вполне могли бы быть интерфейсами. Нет, можно, конечно, переписать базовый класс как ИздающиеЗвукиИПрыгающие, но это полный отстой. Потому что, будильник, например, не прыгает, а давление ( ) прыгает, но не издает звуки. Да и если появится заказ на ПишущихНаФоруме, то представьте, как глупо будет добавлять в базовый класс еще и это, когда у вас только человек может это делать.
Теперь понятен смысл, спасибо!
Цитата:
Сообщение от shturman1387 Посмотреть сообщение
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExampleForMax
{
    class Program
    {
        static void Main(string[] args)
        {
            ILogger consoleLogger = new ConsoleLogger();

            ILogger fileLogger = new FileLogger();

            Report report = new Report(consoleLogger);
            report.Save();
        }
    }

    interface ILogger
    {
        void Log();
    }

    class DbLogger : ILogger
    {
        public void Log()
        {
            Console.WriteLine("Db");
        }
    }

    class ConsoleLogger : ILogger
    {
        public void Log()
        {
            Console.WriteLine("Console");
        }
    }

    class FileLogger : ILogger
    {
        public void Log()
        {
            Console.WriteLine("File");
        }
    }

    class Report
    {
        private ILogger _logger;

        public Report(ILogger logger)
        {
            _logger = logger;
        }

        public void Save()
        {
            _logger.Log();
        }
    }
}
И пример по теме, тоже спасибо!

Фух... наконец то разобрался!

Последний раз редактировалось Мaкс; 08.07.2018 в 17:27. Причина: ... ---> !
Мaкс вне форума Ответить с цитированием
Старый 08.07.2018, 18:28   #42
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

ACE Valery, не самый удачный пример... но сойдет.

Цитата:
Сообщение от Мaкс Посмотреть сообщение
Фух... наконец то разобрался!
Отлично. Тогда вопрос для самоконтроля: чем интерфейсы лучше ранее предлагаемого вами наследования? может какие-то проблемы возникают?
p51x на форуме Ответить с цитированием
Старый 08.07.2018, 23:47   #43
shturman1387
Форумчанин
 
Аватар для shturman1387
 
Регистрация: 12.06.2012
Сообщений: 110
По умолчанию

Цитата:
Сообщение от Мaкс Посмотреть сообщение
Фух... наконец то разобрался!
Супер!!! Мои поздравления
shturman1387 вне форума Ответить с цитированием
Старый 09.07.2018, 11:35   #44
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вопрос для самоконтроля: чем интерфейсы лучше ранее предлагаемого вами наследования?
1)В интерфейсах нельзя реализовать функцию - она реализуется в классе, это может быть полезно тогда, когда нельзя использовать класс, вот на примере который скинул shturman1387, там просто так нельзя это изменить - нужно сильно будет переделывать программу. (код примера в посте №34.)
2)<До того как написал 1), я помнил 2-е преимущество интерфейса, это преимущество полезнее чем 1), попытался вспомнить - не вспомнил, вспомню
- напишу.>

Но при этом я понял, где можно это использовать.
Мaкс вне форума Ответить с цитированием
Старый 09.07.2018, 11:42   #45
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Значит вы так ничего и не поняли. Спрошу по другому: в моем примере из двух классов ЛоггерВФайл и ЛоггерВБазу какие проблемы возникают при предложенном вами наследовании ЛоггерВФайл : ЛоггерВБазу (или наоборот)?

П.С. Как раз в примере shturman1387 класс спокойно можно использовать...
p51x на форуме Ответить с цитированием
Старый 09.07.2018, 11:49   #46
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Какие проблемы возникают при предложенном вами наследовании ЛоггерВФайл : ЛоггерВБазу
Ну например доступ у ЛоггерВФайл есть доступ к ЛоггерВФайл и ЛоггерВБазу, а у ЛоггерВБазу только доступ к ЛоггерВБазу...
Мaкс вне форума Ответить с цитированием
Старый 09.07.2018, 11:52   #47
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

И? А с добавлением интерфейса доступ вообще исчезнет... Проблема то в чем?
p51x на форуме Ответить с цитированием
Старый 09.07.2018, 11:54   #48
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Ой... совсем забыл что можно указывать неограниченное колличество интерфейсов, отличие от классов.
Мaкс вне форума Ответить с цитированием
Старый 09.07.2018, 11:56   #49
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

В моем примере только два класса и, возможно, интерфейс. Множественное наследование там не нужно.

П.С. Скажу больше: даже в С++, где есть множественное наследование, будет такая же проблема.
p51x на форуме Ответить с цитированием
Старый 09.07.2018, 11:57   #50
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

Тогда не знаю...
Мaкс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Несколько дней уже не могу разобраться с кодом... timedo HTML и CSS 1 25.02.2013 09:49
уже несколько дней не могу решить две задачки badim4k Паскаль, Turbo Pascal, PascalABC.NET 0 16.12.2011 16:41
ДУЗЬЯ! НУЖНА ПОМОЩЬ ТЕХ, ХТО УЖЕ СТАЛКИВАЛСЯ С ЭТИМ! matfey Компьютерное железо 4 19.10.2009 19:09
Помогите школьнику kvx Microsoft Office Excel 6 20.09.2009 21:09