Имя: Пароль:
IT
 
Зачем абстрактные классы? C# и не только
0 Shur1cIT
 
08.07.15
10:28
Решил посмотреть другие языки программирования помимо 1с, про ООП почитал видео посмотрел. так и не понял зачем создавать абстрактный класс, а потом на основании него создавать потомка в котором должны быть описаны алгоритм методов? почему бы сразу не создать класс и в нем не прописать алгоритм методов? и при необходимости от него создавать потомков добавляя например новые методы?
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) Смирился.