Re[3]: Интерфейсы, не могу понять зачем... :(
От: nayato Россия  
Дата: 02.05.05 20:10
Оценка: 10 (4) +1 :))) :)))
Здравствуйте, soljen, Вы писали:

S>Доброго времени суток, TK!


TK>>COM тут совершенно не причем. Интерфейс это стредство для абстрагирования от конкретной реализаци. И, если реализация может быть одна (множественного наследования нет), то интерфейсов может быть несколько (есть множественное наследование).


S>Т.е. своими словами, это возможность использовать методы класа не создавая его наследника?


S> В корень запутался!


Глупый пример:
есть светильник и токарный станок
Оба имеют выключатель.
Так вот есть два пути:
1) выделить общего предка "штука с выключателем", что зачастую бывает абсолютно некорректно
2) объявить интерфейс "выключателя" (например интерфейс ISwitchable с методом switch() ) и указать, что светильник и станок реализуют этот интерфейс, что уже более корректно.

В первом случае проблем даже больше чем просто некорректность — там еще заморочки с абстрактными методами, перекрытием... С интерфейсом все ясно — объявил, что класс реализует интерфейс, значит в классе должны быть объявлены все члены этого самого интерфейса.
В примере еще одна характерная весчь — метод switch() для классов станка и светильника будет наверняка в корне отличаться по реализации, зато интерфейс один и когда придет к нам РАО ЕЭС со своим рубильником то сможет сделать пакость одним движением руки ((ISwitchable)obj).switch()
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Интерфейсы, не могу понять зачем... :(
От: Аноним  
Дата: 02.05.05 18:06
Оценка: 8 (3) :))
public interface Кусаемое
{
public void Откусить();
}
public class НесъедобныеОбъекты
{
}
public class ВкусныеОбъекты
{
}
public class Ручка:НесъедобныеОбъекты,Кусаемое
{
#region Кусаемое Members
public void Откусить()
{
Console.WriteLine ( "Тьфу какая, гадость!" );
}
#endregion
}
public class Яблоко:Кусаемое
{
#region Кусаемое Members
public void Откусить()
{
Console.WriteLine ( "МММ.... Вкуснятина!" );
}
#endregion
}
public class Человек
{
public void Покусать (Кусаемое чтото)
{
for(Int32 i = 0; i < 10; i++)
{
чтото.Откусить();
}
}
}



Объект типа "Человек" может покусать все что является Кусаемым. Но Кусаемое не обязано быть СъедобнымОбъектом. Интерфейс описывает только методы, которые поддерживает объект. Любое Кусаемое можно Откусить.

Понятно объяснил?
Microsoft Student Partner (СПбГПУ)


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Интерфейсы, не могу понять зачем... :(
От: TK Лес кывт.рф
Дата: 02.05.05 19:15
Оценка: 2 (1)
Hello, "soljen"

> Звыняйте за ламерский вопрос, о всё же...

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

COM тут совершенно не причем. Интерфейс это стредство для абстрагирования от конкретной реализаци. И, если реализация может быть одна (множественного наследования нет), то интерфейсов может быть несколько (есть множественное наследование).
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Интерфейсы, не могу понять зачем... :(
От: nayato Россия  
Дата: 02.05.05 19:36
Оценка: 2 (1)
Здравствуйте, soljen, Вы писали:

S>Доброго времени суток, дамы и господа!


S>Звыняйте за ламерский вопрос, о всё же...

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

S>И всё же для чего они нужны? Расскажите, если не трудно!


Интерфейс дает представление внешней среде о том, как она /среда/ может с ним /объектом/ взаимодействовать.
Так среда может почти не знать "что есть объект" по сути (не знать пути наследования), но знать что объект реализует определенный интерфейс, т.е. способ общения.
Использование — указывая, что данный класс реализует определенный интерфейс, ты обязываешься заложить в класс указанные в описании интерфейса члены и скорее всего реалзовать в этом классе поведение, описываемое интерфейсом.
Возможен также вариант "return NOT_IMPLEMENTED;", когда данный класс реализует несколько "урезанный" вариант интерфейса, но это bad code ИМХО, поскольку в местах использования интерфейса (при реализации той самой среды) придется проверять полноту реализации. Проще внегласно предъявить требование "если класс обязывается реализвать интерфейс, то он его реализует в полной мере", а урезанный вариант увязать с наследованием интерфейсов, выделив "урезанный" функционал в родительский интерфейс.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re[5]: Интерфейсы, не могу понять зачем... :(
От: Andrbig  
Дата: 03.05.05 08:01
Оценка: 2 (1)
Здравствуйте, soljen, Вы писали:

S>А почем не метод? Чем плох метод в данном случае? Или в каких лучше методы использовать, в каких интерфейсы?


Дело не в том, плох он или нет, а в том, что цепочки наследования у токарного станка и у светильника могут со-о-овсем разными и выделить "штуку с выкючателем" ты просто не сможешь.

Есть еще один момент, о котором не упомянули. Классы могут иметь свои данные, интерфейсы — нет.
Интерфейсы, не могу понять зачем... :(
От: Аноним  
Дата: 03.05.05 12:09
Оценка: 2 (1)
>Интерфейсы, не могу понять зачем.
здесь
С уважением, Александр. AlexKD Blog


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Интерфейсы, не могу понять зачем... :(
От: nayato Россия  
Дата: 03.05.05 16:18
Оценка: 2 (1)
Здравствуйте, soljen, Вы писали:

S>А почем не метод? Чем плох метод в данном случае? Или в каких лучше методы использовать, в каких интерфейсы?


А в смысле метод? Вижу два варианта ответа:
1) у выделенного общего предка
2) просто у каждого написать switch(), не заморачиваясь на интерфейсах

Так вот:
1) уже разъяснили — некорректно может быть выделять этого самого предка.
2) тогда нет унифицированного доступа. Конечно можно с Reflection играться, но смысл, когда для этого и созданы интерфейсы?! Продолжим извращаться: есть класс "общий рубильник" (ЕЭСовский ), который держит список произвольных объектов с единственным требованием — они должны реализовывать интерфейс ISwitchable. Тогда для переключения всех сразу достаточно вызвать метод этого рубильника:
public void turnOffAll()
{
    foreach (Object obj in fSwitchableObjectsCollection) {
        ((ISwitchable)obj).switch();
    }
}


или что-то вроде...
как просто сделать это "методом" во втором смысле мне что-то не представляется...
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Re[4]: Интерфейсы, не могу понять зачем... :(
От: Аноним  
Дата: 04.05.05 08:10
Оценка: 2 (1)
Чем плох метод в данном случае?

Чтобы вызвать метод, нужно заранее знать тип (класс) объекта.

Фактически, Вы и вызываете метод. Только сначала приводите объект (тип которого Вам во время компиляции неизвестен) к интерфейсу (про который известно на момент компиляции, что данный объект его реализует).



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[8]: Интерфейсы, не могу понять зачем... :(
От: nayato Россия  
Дата: 03.05.05 15:46
Оценка: +1
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, Twirl, Вы писали:


T>>Здравствуйте, Andrbig, Вы писали:


A>>>Здравствуйте, soljen, Вы писали:


S>>>>А почем не метод? Чем плох метод в данном случае? Или в каких лучше методы использовать, в каких интерфейсы?


A>>>Дело не в том, плох он или нет, а в том, что цепочки наследования у токарного станка и у светильника могут со-о-овсем разными и выделить "штуку с выкючателем" ты просто не сможешь.


A>>>Есть еще один момент, о котором не упомянули. Классы могут иметь свои данные, интерфейсы — нет.


T>>Однако интерфэйсы могут определять свойства и события.


A>Классы тоже


Я думаю Троелсен этого не упустил
И вообще вопрос был ни что умеют интерфейсы, а зачем они вообще. Кстати, интересно кто как изощряется в этой области
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Интерфейсы, не могу понять зачем... :(
От: soljen Интернет  
Дата: 02.05.05 17:46
Оценка:
Доброго времени суток, дамы и господа!

Звыняйте за ламерский вопрос, о всё же...
Разбираюсь с книгой "C# и платформа .NET" Троелсена и никак не могу взять в толк где и при каких обстоятельствах применять интерфейсы! Понял только что пришли они из мира COM, и необходимы для того, чтоб клиент мог взаимодействовать с класом...

И всё же для чего они нужны? Расскажите, если не трудно!

Премного благодарен!
... << RSDN@Home 1.1.4 beta 5 rev. 414>>
Тиха украинская ночь, но сало надо перепрятать!!!
Интерфейсы, не могу понять зачем... :(
От: Аноним  
Дата: 02.05.05 18:08
Оценка:
забыл... Яблоко должно наследоваться от ВкусногоОбъекта
Microsoft Student Partner (СПбГПУ)


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Интерфейсы, не могу понять зачем... :(
От: soljen Интернет  
Дата: 02.05.05 19:58
Оценка:
Доброго времени суток, TK!

TK>COM тут совершенно не причем. Интерфейс это стредство для абстрагирования от конкретной реализаци. И, если реализация может быть одна (множественного наследования нет), то интерфейсов может быть несколько (есть множественное наследование).


Т.е. своими словами, это возможность использовать методы класа не создавая его наследника?

В корень запутался!
... << RSDN@Home 1.1.4 beta 5 rev. 414>>
Тиха украинская ночь, но сало надо перепрятать!!!
Re[4]: Интерфейсы, не могу понять зачем... :(
От: soljen Интернет  
Дата: 02.05.05 20:54
Оценка:
Доброго времени суток, nayato!

N>Глупый пример:

N>есть светильник и токарный станок
N>Оба имеют выключатель.
N>Так вот есть два пути:
N>1) выделить общего предка "штука с выключателем", что зачастую бывает абсолютно некорректно
N>2) объявить интерфейс "выключателя" (например интерфейс ISwitchable с методом switch() ) и указать, что светильник и станок реализуют этот интерфейс, что уже более корректно.

N>В первом случае проблем даже больше чем просто некорректность — там еще заморочки с абстрактными методами, перекрытием... С интерфейсом все ясно — объявил, что класс реализует интерфейс, значит в классе должны быть объявлены все члены этого самого интерфейса.


Угу, немного прояснилось! Перечитаю ка я главу ещё разок, да примерчики поковыряю снова!

N>... и когда придет к нам РАО ЕЭС со своим рубильником то сможет сделать пакость одним движением руки ((ISwitchable)obj).switch()


— Ночной дозор! Всем снмать штаны Ясно!

Спасибо! Буду копать!
... << RSDN@Home 1.1.4 beta 5 rev. 414>>
Тиха украинская ночь, но сало надо перепрятать!!!
Re[5]: Интерфейсы, не могу понять зачем... :(
От: RagiC Беларусь  
Дата: 02.05.05 21:01
Оценка:
S>Угу, немного прояснилось! Перечитаю ка я главу ещё разок, да примерчики поковыряю снова!

Давай, давай, Троелсен об этом хорошо пишет! Я, например, только у него понял, для чего интерфейсы нужны.
Re[4]: Интерфейсы, не могу понять зачем... :(
От: soljen Интернет  
Дата: 03.05.05 07:27
Оценка:
Доброго времени суток, nayato

N>Глупый пример:

N>есть светильник и токарный станок
N>Оба имеют выключатель.
N>Так вот есть два пути:
N>1) выделить общего предка "штука с выключателем", что зачастую бывает абсолютно некорректно
N>2) объявить интерфейс "выключателя" (например интерфейс ISwitchable с методом switch() ) и указать, что светильник и станок реализуют этот интерфейс, что уже более корректно.

N>В первом случае проблем даже больше чем просто некорректность — там еще заморочки с абстрактными методами, перекрытием... С интерфейсом все ясно — объявил, что класс реализует интерфейс, значит в классе должны быть объявлены все члены этого самого интерфейса.

N>В примере еще одна характерная весчь — метод switch() для классов станка и светильника будет наверняка в корне отличаться по реализации, зато интерфейс один и когда придет к нам РАО ЕЭС со своим рубильником то сможет сделать пакость одним движением руки ((ISwitchable)obj).switch()

А почем не метод? Чем плох метод в данном случае? Или в каких лучше методы использовать, в каких интерфейсы?

Премного благодарен!
... << RSDN@Home 1.1.4 beta 5 rev. 414>>
Тиха украинская ночь, но сало надо перепрятать!!!
Re[6]: Интерфейсы, не могу понять зачем... :(
От: Twirl Швеция  
Дата: 03.05.05 09:42
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, soljen, Вы писали:


S>>А почем не метод? Чем плох метод в данном случае? Или в каких лучше методы использовать, в каких интерфейсы?


A>Дело не в том, плох он или нет, а в том, что цепочки наследования у токарного станка и у светильника могут со-о-овсем разными и выделить "штуку с выкючателем" ты просто не сможешь.


A>Есть еще один момент, о котором не упомянули. Классы могут иметь свои данные, интерфейсы — нет.


Однако интерфэйсы могут определять свойства и события.
Re[7]: Интерфейсы, не могу понять зачем... :(
От: Andrbig  
Дата: 03.05.05 09:47
Оценка:
Здравствуйте, Twirl, Вы писали:

T>Здравствуйте, Andrbig, Вы писали:


A>>Здравствуйте, soljen, Вы писали:


S>>>А почем не метод? Чем плох метод в данном случае? Или в каких лучше методы использовать, в каких интерфейсы?


A>>Дело не в том, плох он или нет, а в том, что цепочки наследования у токарного станка и у светильника могут со-о-овсем разными и выделить "штуку с выкючателем" ты просто не сможешь.


A>>Есть еще один момент, о котором не упомянули. Классы могут иметь свои данные, интерфейсы — нет.


T>Однако интерфэйсы могут определять свойства и события.


Классы тоже
Re[6]: Интерфейсы, не могу понять зачем... :(
От: soljen Интернет  
Дата: 03.05.05 16:44
Оценка:
Доброго времени суток, nayato!

N>или что-то вроде...

N>как просто сделать это "методом" во втором смысле мне что-то не представляется...

Всем спасибо!
Начинаю слегка врубаться, будут ещё вопросы — обязательно задам!
... << RSDN@Home 1.1.4 beta 5 rev. 414>>
Тиха украинская ночь, но сало надо перепрятать!!!
Интерфейсы, не могу понять зачем... :(
От: Аноним  
Дата: 03.05.05 18:00
Оценка:
>?, 02.05.05 22:46
>И всё же для чего они нужны?
Вам необходимо скрыть реализацию функциональности.



данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Интерфейсы, не могу понять зачем... :(
От: Аноним  
Дата: 04.05.05 08:28
Оценка:
наследование нескольких классов сразу запрещено, а интерфейсов нет....


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Интерфейсы, не могу понять зачем... :(
От: soljen Интернет  
Дата: 04.05.05 09:15
Оценка:
Доброг овремени суток, Sahikon!

[цензура ]


S>Объект типа "Человек" может покусать все что является Кусаемым. Но Кусаемое не обязано быть СъедобнымОбъектом. Интерфейс описывает только методы, которые поддерживает объект. Любое Кусаемое можно Откусить.


S>Понятно объяснил?


Да, вполне понятно!
Премного благодарен за ответы!
Тиха украинская ночь, но сало надо перепрятать!!!
Re: Интерфейсы, не могу понять зачем... :(
От: Аноним  
Дата: 05.05.05 14:18
Оценка:
Если сравнивать interface с железной дорогой то можно сказать примерно так:

interface это рельсы по которым могут ездить паровозы любого типа (объекты) у которых ширина оси совпадает с расстоянием между рельсами (сигнатура и название методов у объекта соответствует сигнатуре и названиям методов у интерфейса)


-- Если тебе помогли, незабудь сказать спасибо --
-- Это всё мое личное мнение которое может не совпадать с Вашим или может быть ошибочным --

.NetCoder


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Интерфейсы, не могу понять зачем... :(
От: Lloyd Россия  
Дата: 05.05.05 17:38
Оценка:
Здравствуйте, dotnetcoder, Вы писали:

D>interface это рельсы по которым могут ездить паровозы любого типа (объекты) у которых ширина оси совпадает с расстоянием между рельсами (сигнатура и название методов у объекта соответствует сигнатуре и названиям методов у интерфейса)


Нет, интерфейс — это не рельсы, интерфейс — это таки паравоз.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: Интерфейсы, не могу понять зачем... :(
От: shredder Россия  
Дата: 14.07.05 11:41
Оценка:
Здравствуйте, Sahikon, Вы писали:


S>public interface Кусаемое

S>{
S>public void Откусить();
S>}
S>public class НесъедобныеОбъекты
S>{
S>}
S>public class ВкусныеОбъекты
S>{
S>}



using System;

namespace my
{
    public interface Кусаемое
    {
        void Откусить();
    }
    //
    public class НесъедобныеОбъекты
    {
    }
    //
    public class ВкусныеОбъекты
    {
    }
    //
    public class Ручка:НесъедобныеОбъекты,Кусаемое
    {
        public void Откусить()
        {
            Console.WriteLine ( "Тьфу какая, гадость Ручка!" );
        }
    }
    //
    public class Яблоко:ВкусныеОбъекты,Кусаемое
    {
        public void Откусить()
        {
            Console.WriteLine ( "МММ.... Вкуснятина! Яблоко" );
        }
    }
    //
    class my
    {
        public static void Main()
        {
            object[] obj = new object[2];
            obj[0] = new Ручка();
            obj[1] = new Яблоко();
            foreach (Object obje in obj) 
                   ((Кусаемое)obje).Откусить();
            


        }
    }

    
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.