Имя: Пароль:
IT
 
Зачем абстрактные классы? C# и не только
,
0 Shur1cIT
 
08.07.15
10:28
Решил посмотреть другие языки программирования помимо 1с, про ООП почитал видео посмотрел. так и не понял зачем создавать абстрактный класс, а потом на основании него создавать потомка в котором должны быть описаны алгоритм методов? почему бы сразу не создать класс и в нем не прописать алгоритм методов? и при необходимости от него создавать потомков добавляя например новые методы?
1 Волшебник
 
модератор
08.07.15
10:30
Взгляни на биологическую классификацию. Есть абстрактный класс "Млекопитающие" с методом "кормить потомство молоком", но у каждого представителя свой состав молока и детали кормления.
2 Ненавижу 1С
 
гуру
08.07.15
10:32
(0) в 1С также: Документ абстрактный класс, нельзя создавать экземпляры непосредственно данного класса. А вот ПКО, РКО и проч. - вполне конкретные классы и проведение в каждом из них реализовано по своему
3 Garykom
 
гуру
08.07.15
10:33
(1) а может "Млекопитающие" это не абстрактный класс, а интерфейс?
4 Asmody
 
08.07.15
10:33
(0) В абстрактном классе можно создавать реализацию методов.
Абстрактность тебе не позволит создать экземпляр класса.
5 Ненавижу 1С
 
гуру
08.07.15
10:34
(3) это хорошая тема обсуждения: интерфейс против абстрактный класс

но если надо что-то хранить еще (поля), то только абстрактный класс, аналогично с защищенными методами
6 Shur1cIT
 
08.07.15
10:35
(1) согласен, но какой практический смысл? у каждого представителя свой класс в нем метод "Кормить молоком" по любому создаваться объект будет из класса представителя и использоваться метод будет именно представителя. зачем он в абстрактном вписан?
7 MadHead
 
08.07.15
10:35
(0) Еддинственная разница в надежности и защиты от ошибок в разработке и в некотором смыслле улучшениии чтения кода. К примеру обстрактный класс дает понять программисту что нельзя создавать экземпляр этого класса, что некоторые методы нужно обязательно реализовать. Но работать будет одиаково с вашим вариантом
8 Garykom
 
гуру
08.07.15
10:37
(6) а штобы можно было взять конкретного потомка человек1 типа "Человека" и сделать такой ход конем:

(Млекопитающее)человек1.ПокормитьМолоком();
9 Asmody
 
08.07.15
10:37
(3) В современных языках все стало размыто, но "по классике" интерфейс не может содержать реализации методов, от интерфейса нельзя наследоваться, только реализовать.
10 Garykom
 
гуру
08.07.15
10:38
(8) т.е. код может не знать нифига о "Человека" но зная что оно произошло от "Млекопитающее" можно вызвать метод абстрактного класса для конкрентного потомка и он как нуна отработает
11 MadHead
 
08.07.15
10:38
(9) тут не важно будь млекопитающее абстрактным классом, или быкновенным классом или интерфейсом
12 Asmody
 
08.07.15
10:38
Вообще, нужно сначала понять, с какой целью был создан тот или иной механизм.
13 Garykom
 
гуру
08.07.15
10:39
(9) про это и речь... не факт что все млекопитающие произошли от одного потомка... у них просто есть одинаковый (похожий) метод кормления детенышей ))
14 1Сергей
 
08.07.15
10:39
возьми за пример игру space invaders.
Есть корабли, есть мухи. Это летатаельные объекты. Коробли управляемые пользователем. Мухи летают сами. Считай наследники класса.
Мухи, в свою очередь, летают по разному. имеют разные свойства (ХП, скорость stc)...
15 megabax
 
08.07.15
10:40
(0) Что бы абстрагироваться от конкретных объектов. Вот например, ты пишешь программу для рисования векторной графики. У тебя есть объект прямая, кривая безье, круг, треугольник. Все их можно нарисовать. Но каждый из них рисуется по разному. Но эти объекты тебе придется где то хранить. Для этого нужен общий тип, который походит ко всем этим объектам. Это и есть абстрактный класс. но так как ты не знаешь, круг это будет или треугольник, ты не можешь у этого типа реализовать метод "рисовать". Но зато можешь объявить класс потомок, у которого ты его реализуешь, у каждого класса свой. И переменной типа "Абстрактный класс фигуры" ты можешь присвоить любого потомка этого класса.
16 Asmody
 
08.07.15
10:40
(13) метод ПокормитьМолоком() может быть в общем случае реализован в абстрактном классе. Класс-потомок может его переопределить при необходимости.
17 Гёдза
 
08.07.15
10:42
А зачем вообще сделали и интерфейсы и абстрактные классы?
Типо 2 команды разрабатывали по отдельности. Потом не решили что есть лучше и включили обе штуки?
18 Shur1cIT
 
08.07.15
10:42
(7) (15) ок спасибо всё понял, просто в августе в магистратуру поступаю на прикладное программирование вот и приходиться в тему въезжать
19 Волшебник
 
модератор
08.07.15
10:43
(17) А ещё есть делегаты...
20 Asmody
 
08.07.15
10:43
(17) А есть еще трейты и миксины.
21 Draziw
 
08.07.15
10:43
Могу на примере перивести
допустим надо создать обработку отрисовки нескольких объектов, объекты разноплановые и единственное что их объединяет - это то что их можно рисовать.
Создаем абстрактный класс GLESObject например.
А от него наследуем все остальное
Rectangle2D extends GLESObject
Cube3D extends GLESObject
CubeMap3D extends GLESObject
в которых уже мы непослередственно всю реализацию и отрисовку прописываем.
после создания объектом, наб будет достаточно пробижаться по массиву объектов GLESObject чтобы их все нарисовать сразу, и не потребуется перебирать массивы по отдельности для каждого класса.
        for (GLESObject tekObject:sceneLayer) {
            GLES20.glUseProgram(tekObject.getShaderProgramInstance().programHandler);                        
            tekObject.draw(viewMatrix,projectionMatrix, timer);                                                
        }
22 megabax
 
08.07.15
10:44
(17) В C#, например, класс может наследовать несколько интерфейсов, а несколько классов не может. Хотя, в C++ пошли другим путем, сделали множественное наследование. А вообще, интерфейс как вариант, применяется там, где надо создать СCOM-объект.
23 Garykom
 
гуру
08.07.15
10:45
я не понял это форум 1С-ников или "канал об аниме" ?
24 Господин ПЖ
 
08.07.15
10:45
>в C++ пошли другим путем, сделали множественное наследование

порочная практика
25 Asmody
 
08.07.15
10:45
(23) одинесники не программисты
26 Asmody
 
08.07.15
10:46
(24) Всё наблюдаемое многообразие ЯП из-за несовершенства C++
27 megabax
 
08.07.15
10:47
(24) Да, действительно, там даже есть такое понятие, как виртуальный класс, что бы он два раза не наследовался.
28 Serginio1
 
08.07.15
10:47
Самый простой пример это Stream. Используя единый интерфейс ты можешь читать хоть откуда. Из файла, из WebResponse из базы данных итд
29 Jokero
 
08.07.15
10:48
В родительском классе описываются общие методы и переменные для всех потомков. Потом ты можешь в потомке изменить или добавить метод и переменную, а можешь этого и не делать и она спокойно унаследуется к потомку, при этом ее не надо снова описывать.
30 Живой Ископаемый
 
08.07.15
10:48
Абстрактные классы и интерфейсы и протоколы - для реализации одних из самых важных паттернов:
Фабрика, Абсрактная Фабрика, Делегирование.

Для 1Сников.
у тебя один абстрактный класс, который говорит что, чтобы класс ему соответсвовал (conforms to), тот должен иметь вот такие-то обязательные свойства и методы.

Потом ты например объявляешь процедуру
func MyProcedure(SomeInstance: MyProtocol)

А когда вызываешь эту процедуру, то уже пишешь:

MyProcedure(MyInstanceOfFirstClassConformedToMyProtocol)
MyProcedure(MyInstanceOfSeconfClassConformedToMyProtocol)

То есть по сути Абстрактный класс ну... помогает абстрагироваться от конкретного типа.
31 Ненавижу 1С
 
гуру
08.07.15
10:49
про NULL и Неопределено еще рано?
32 toypaul
 
гуру
08.07.15
10:49
"почему бы сразу не создать класс и в нем не прописать алгоритм методов" - а кто сказал, что так не делают? как раз так и делают. но прописывают "алгоритмы" общие для всех потомков.
33 Гёдза
 
08.07.15
10:50
Придумать правильную топологию классов для программы отнюдь не простая задача
34 Живой Ископаемый
 
08.07.15
10:50
2(31) Optionals?
35 Garykom
 
гуру
08.07.15
10:50
(30) как бы 1С-ники пользуются "абстрактными классами" совершенно об этом не задумываясь

когда вызывают .Записать(); для объекта справочника
36 Волшебник
 
модератор
08.07.15
10:51
(31) пусть поближе подойдут
37 Бубка Гоп
 
08.07.15
10:52
(35) еще есть модуль менеджера
38 Serginio1
 
08.07.15
10:52
28+ виртуальные методы в отличие от методов интерфейсов наследуются. То есть меньше писанины
39 Serginio1
 
08.07.15
10:53
(35) Это утинная типизация. Нет наследования
40 ДенисЧ
 
08.07.15
10:53
(0) Если ты не знаешь, что такое абстрактный класс, то это тебе не надо...
41 Господин ПЖ
 
08.07.15
10:54
(37) это static. причем тут абстракция
42 Ненавижу 1С
 
гуру
08.07.15
10:55
(39) можно сказать, что класс автоматически реализует "интерфейс имеющий метод Записать", как только у него есть этот метод )))
ну собственно да, утиная типизация и все абсолютно методы виртуальны ))
43 Ненавижу 1С
 
гуру
08.07.15
10:56
(41) ближе к дельфийским class method
чем к static method
44 megabax
 
08.07.15
10:56
(40) А ты с самого рождения знал, что такое абстрактный класс?
45 Serginio1
 
08.07.15
10:57
(41) В Delphi есть такое понятие как метаклассы. Виртуальный конструктор, виртуальные методы класса
class Function StaticVirt:String; virtual;

http://rsdn.ru/forum/delphi/559531.flat.1
46 Garykom
 
гуру
08.07.15
10:58
Попробовал глянуть на эту ветку отстраненно... хуже только математики с их "абстракциями"

(44) он в его методе потомка родился...
47 Господин ПЖ
 
08.07.15
10:58
забудьте уже про дельфи как про страшный сон
48 Garykom
 
гуру
08.07.15
10:59
(47) счего бы? точнее с удовольствием бы забыли но на чем (кроме с++ на котором слишком тормозно писать) можно сделать кроссплатформенный код который не требует туеву тучу фремворков и прочих окружений?
49 megabax
 
08.07.15
11:00
(35) Вот в 1С-ке очень ОПП, кстати, не хватает. Как было бы хорошо, если бы когда мне потребовалось написать, например, свою расходную накладную, я типа объявил бы потомка класса РасходнаяНакладная и реализовал бы у нее какие то свои методы.
50 Ненавижу 1С
 
гуру
08.07.15
11:00
(47) ну почему? реализация метакласса на уровне языка была неплохой, хотя и страдала проблемой - нельзя было сокрыть конструкторы, из-за общего предка TObject
51 Бубка Гоп
 
08.07.15
11:00
(47) он не хочет отпускать
52 Ненавижу 1С
 
гуру
08.07.15
11:01
(49) начинается...
53 fisher
 
08.07.15
11:01
(22) Как бы наоборот. Интерфейсы придумали, поглядев на проблемы множественного наследования в С++. Чтобы с помощью них и ряда других инструментов языка можно было безопасно решать задачи, которые в С++ решались множественным наследованием.
54 Garykom
 
гуру
08.07.15
11:01
(52) да ладно пусть помечтает об 1С++ для 8-ки
55 Господин ПЖ
 
08.07.15
11:02
(49) Вот в 1С-ке очень ОПП, кстати, не хватает.

1с тут вполне ООП... у тебя РасходнаяНакладная просто изолирована
56 Mikeware
 
08.07.15
11:02
(54) злой ты
57 Лефмихалыч
 
08.07.15
11:02
(0) если почтиать мануал какой-нибудь, то ответ там будет дан. Абстрактные классы для того, чтобы просто сгруппировать набор абстрактных методов, которым не нужен ни какой инстанс для работы. Math, например, в C#, - ни какого объекта ему не придумать, а функции его нужны
58 ДенисЧ
 
08.07.15
11:03
(44) Lf
59 Лефмихалыч
 
08.07.15
11:03
(47) опасностьЪ! тебя щас Ежов покусает
60 Ненавижу 1С
 
гуру
08.07.15
11:03
(57) Math вроде не абстрактный, а статический класс
61 Господин ПЖ
 
08.07.15
11:03
>Абстрактные классы для того, чтобы просто сгруппировать набор абстрактных методов, которым не нужен ни какой инстанс для работы

для этого есть статика
62 Господин ПЖ
 
08.07.15
11:04
абстрактность решает другие задачи
63 Лефмихалыч
 
08.07.15
11:04
(60) эмм... да, именно, я одно с другим попутал. в (75) деза. прошу парощения
64 ДенисЧ
 
08.07.15
11:04
(53) в с++ нет проблем с множественным наследованием. Они есть у тех, кто не умеет его использовать
65 fisher
 
08.07.15
11:04
(57) Для этой задачи вовсе не нужна отдельная сущность. Так что нормальный новичковый вопрос в сабже.
66 Гёдза
 
08.07.15
11:05
(57) Чем в данном случае класс лучше модуля с процедурами?
67 Shur1cIT
 
08.07.15
11:05
(49) если ООП появиться в 1С, то 1с рынок ларёчников потеряет ибо настройка 1с им станет дороже, так как другого уровня спецы понадобиться.
68 Гёдза
 
08.07.15
11:05
Понятно, что в жаве например все через классы, но это не от хорошей жизни
69 Ненавижу 1С
 
гуру
08.07.15
11:05
(66) для статических ничем, фактически это просто аналог namespace
70 Serginio1
 
08.07.15
11:06
(42) Это двойная диспетчиризация (IDispatch), рефлексия вместо VMT
71 Гёдза
 
08.07.15
11:06
(67) ларечникам только галочки выставлять.
72 Garykom
 
гуру
08.07.15
11:06
(59) "Ежов" это кто?
73 Господин ПЖ
 
08.07.15
11:06
>Понятно, что в жаве например все через классы, но это не от хорошей жизни

а от какой? зато все единообразно... все перепаковывается в Object
74 Гёдза
 
08.07.15
11:06
(71) как собственно во всем мире и бывает. Никакой ларек не пишет для себя своего ПО
75 Лефмихалыч
 
08.07.15
11:07
(0) Абстрактный класс - это интерфейс. Он нужен, чтобы описать поведение для множественного наследования.
Множественное наследование имплементации - штука, имеющая право на жизнь и реализуемая, но требующая больше трахотни от производителя компилатора. По этому в современных языках это не модно.
76 megabax
 
08.07.15
11:07
(66) Тем что можно создать экземпляр класса, но вот экземпляр модуля с процедурами ты не можешь создать.
77 Лефмихалыч
 
08.07.15
11:07
(72) Hadgehogs
78 Lama12
 
08.07.15
11:07
(20) До этого сообщения я еще был в курсе обсуждения :)
Придется обновлять знания.
79 Garykom
 
гуру
08.07.15
11:07
(68) там даже проперти нет... как уже задрали эти "геттеры" и "сеттеры"
точнее когда на яве долго пишешь то привыкаешь и норм... зато когда с чего то другого возвращаешься...
80 Лефмихалыч
 
08.07.15
11:08
+(75) то есть, если вопрос в том, почему нельзя без них, то ответ - да можно. Заморочек больше просто.
81 Draziw
 
08.07.15
11:08
(66) Модуль это и есть класс :) в c#, java нет модулей если что :)
82 Гёдза
 
08.07.15
11:08
(79) в жаве нет проперти????
83 Ненавижу 1С
 
гуру
08.07.15
11:08
(76) экземпляр статического класса не создашь
84 Гёдза
 
08.07.15
11:08
(82) или что ты подразумеваешь под проперти?
85 Garykom
 
гуру
08.07.15
11:08
(82) да

но можно скалу юзать...
86 fisher
 
08.07.15
11:09
(64) Так в этом и проблема. На больших проектах самые разные люди в команду приходят и уходят. Поэтому чем грамотнее сама среда даёт по рукам - тем лучше продукт при прочих равных.
87 Asmody
 
08.07.15
11:09
Далось вам это "ООП в 1С". Люди создают новые ЯП вообще без ООП, и ничего, прекрасно развиваются.
88 Garykom
 
гуру
08.07.15
11:09
(84) код работающий при присваивании/получении значения "реквизита" объекта
89 Ненавижу 1С
 
гуру
08.07.15
11:09
(79) ну зато и нет проблемы:

Obj.MyProperty.Item = 10;

ой, а значение Item осталось старым
90 Лефмихалыч
 
08.07.15
11:10
(84) конструкию, которая для программиста, смотрящего на исходник, выглядит, как поле класса, но на самом деле компилятором разворачивается в вызов get_() и set() методов для доступа к внутреннему сосотянию объекта
91 megabax
 
08.07.15
11:10
(87) Вообще то ООП - самая удобная форма программирования. Во всех других подходах приходиться выворачивать мозги наизнанку, классический пример - F#, lisp.
92 Garykom
 
гуру
08.07.15
11:11
(88) там нуна староеЗначение = Объекта1.getЗначение() и Объекта1.setЗначение(новоеЗначение)
93 Garykom
 
гуру
08.07.15
11:11
(89) "очень смешно"
94 Господин ПЖ
 
08.07.15
11:12
>Люди создают новые ЯП вообще без ООП, и ничего, прекрасно развиваются.

языков тьма, а вакансии все по java/c#/c++/ios/php
95 Garykom
 
гуру
08.07.15
11:12
(91) asm
96 Asmody
 
08.07.15
11:13
(91) Вообще ничего не приходится выворачивать. Ну разве что, в Haskell
97 Garykom
 
гуру
08.07.15
11:14
(94) не ну я конечно в курсе что на php можно с классами писать... но не одного вживую реально юзаещего (самому пишущего новые) не только готовые фреймворки полбзующего не видал...
98 Asmody
 
08.07.15
11:20
(97) А фреймворки нам даны высшими силами?
99 Живой Ископаемый
 
08.07.15
11:22
автор понял про абсрактные классы?
100 Живой Ископаемый
 
08.07.15
11:22
а, понял еще в (18). ок.
101 Garykom
 
гуру
08.07.15
11:28
(98) а платформа 1С нам кем дана?
102 Garikk
 
08.07.15
11:33
платформа дана вендором, а фреймворки это деятельность сообщества

несколько разные вещи. Без платформы ничего сделать не получится, а без фреймворка запросто.
103 megabax
 
08.07.15
11:39
(95) Ну это только для микроконтроллеров всяких, потому что там все равно иного выхода нет.
104 kyvv
 
08.07.15
11:41
А почему в 1с для ссылочных типов значение совпадает с типом?
105 Гёдза
 
08.07.15
11:42
(104) Пруф в студию
106 kyvv
 
08.07.15
11:45
(105) Если я тебя правильно понял, то глянь в отладчике, там в табличке выводится Тип и Значение.
107 Ненавижу 1С
 
гуру
08.07.15
11:46
(104) чего?
108 kyvv
 
08.07.15
12:11
(105,107) Если что не так, то первый блин.
http://s019.radikal.ru/i602/1507/2c/cf9d7a4c2e15.png
109 Господин ПЖ
 
08.07.15
12:12
зобанить за упоротость
110 Ненавижу 1С
 
гуру
08.07.15
12:13
(108) ну это простостроковое представление совпадает с типом, а что иначе там показывать?
111 Asmody
 
08.07.15
12:19
(104) Есть такое понятие "строковое представление значения типа".
112 kyvv
 
08.07.15
12:33
(110)Если есть класс, значит должны быть объекты(значения)? Но я не программист.
113 Garikk
 
08.07.15
12:37
(112) какие значения вам нужны?

что вы хотите увидеть в поле "значение" у объектного типа?
114 kyvv
 
08.07.15
12:46
(113)СправочникОбъект  тип, Контрагенты - Значение
115 Garikk
 
08.07.15
12:48
(114) И? МенеджерВременныхТаблиц - тип, какое вам надо там значение?
116 Ненавижу 1С
 
гуру
08.07.15
12:50
(114) ты понимаешь, что кроме строк на экране ты ничего не видишь и каждый класс/тип сам решает как ему отображать свои объекты
СправочникОбъект.Контрагенты отображает свое Наименование
МенеджерВременныхТаблиц отображает строку "МенеджерВременныхТаблиц"
117 Лефмихалыч
 
08.07.15
12:50
(114) Контрагенты - тоже тип
118 kyvv
 
08.07.15
12:56
(115,116) Это исключение, пусть будет строковое представление.
(117) Дурят нас?
119 Garikk
 
08.07.15
12:57
(118) вообще во "взрослых" языках, точно также это устроено
120 kyvv
 
08.07.15
12:58
(119) Смирился.