|
Зачем абстрактные классы? 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) Смирился.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |