#0
by Shur1cIT
Решил посмотреть другие языки программирования помимо 1с, про ООП почитал видео посмотрел. так и не понял зачем создавать абстрактный класс, а потом на основании него создавать потомка в котором должны быть описаны алгоритм методов? почему бы сразу не создать класс и в нем не прописать алгоритм методов? и при необходимости от него создавать потомков добавляя например новые методы?
#0
by Shur1cIT
Решил посмотреть другие языки программирования помимо 1с, про ООП почитал видео посмотрел. так и не понял зачем создавать абстрактный класс, а потом на основании него создавать потомка в котором должны быть описаны алгоритм методов? почему бы сразу не создать класс и в нем не прописать алгоритм методов? и при необходимости от него создавать потомков добавляя например новые методы?
#1
by Волшебник
Взгляни на биологическую классификацию. Есть абстрактный класс "Млекопитающие" с методом "кормить потомство молоком", но у каждого представителя свой состав молока и детали кормления.
#2
by Ненавижу 1С
в 1С также: Документ абстрактный класс, нельзя создавать экземпляры непосредственно данного класса. А вот ПКО, РКО и проч. - вполне конкретные классы и проведение в каждом из них реализовано по своему
#4
by Asmody
В абстрактном классе можно создавать реализацию методов. Абстрактность тебе не позволит создать экземпляр класса.
#5
by Ненавижу 1С
это хорошая тема обсуждения: интерфейс против абстрактный класс но если надо что-то хранить еще (поля), то только абстрактный класс, аналогично с защищенными методами
#6
by Shur1cIT
согласен, но какой практический смысл? у каждого представителя свой класс в нем метод "Кормить молоком" по любому создаваться объект будет из класса представителя и использоваться метод будет именно представителя. зачем он в абстрактном вписан?
#7
by MadHead
Еддинственная разница в надежности и защиты от ошибок в разработке и в некотором смыслле улучшениии чтения кода. К примеру обстрактный класс дает понять программисту что нельзя создавать экземпляр этого класса, что некоторые методы нужно обязательно реализовать. Но работать будет одиаково с вашим вариантом
#8
by Garykom
а штобы можно было взять конкретного потомка человек1 типа "Человека" и сделать такой ход конем: (Млекопитающее)человек1.ПокормитьМолоком;
#9
by Asmody
В современных языках все стало размыто, но "по классике" интерфейс не может содержать реализации методов, от интерфейса нельзя наследоваться, только реализовать.
#10
by Garykom
т.е. код может не знать нифига о "Человека" но зная что оно произошло от "Млекопитающее" можно вызвать метод абстрактного класса для конкрентного потомка и он как нуна отработает
#11
by MadHead
тут не важно будь млекопитающее абстрактным классом, или быкновенным классом или интерфейсом
#13
by Garykom
про это и речь... не факт что все млекопитающие произошли от одного потомка... у них просто есть одинаковый (похожий) метод кормления детенышей ))
#14
by 1Сергей
возьми за пример игру space invaders. Есть корабли, есть мухи. Это летатаельные объекты. Коробли управляемые пользователем. Мухи летают сами. Считай наследники класса. Мухи, в свою очередь, летают по разному. имеют разные свойства (ХП, скорость stc)...
#15
by megabax
Что бы абстрагироваться от конкретных объектов. Вот например, ты пишешь программу для рисования векторной графики. У тебя есть объект прямая, кривая безье, круг, треугольник. Все их можно нарисовать. Но каждый из них рисуется по разному. Но эти объекты тебе придется где то хранить. Для этого нужен общий тип, который походит ко всем этим объектам. Это и есть абстрактный класс. но так как ты не знаешь, круг это будет или треугольник, ты не можешь у этого типа реализовать метод "рисовать". Но зато можешь объявить класс потомок, у которого ты его реализуешь, у каждого класса свой. И переменной типа "Абстрактный класс фигуры" ты можешь присвоить любого потомка этого класса.
#16
by Asmody
метод ПокормитьМолоком может быть в общем случае реализован в абстрактном классе. Класс-потомок может его переопределить при необходимости.
#17
by Гёдза
А зачем вообще сделали и интерфейсы и абстрактные классы? Типо 2 команды разрабатывали по отдельности. Потом не решили что есть лучше и включили обе штуки?
#18
by Shur1cIT
ок спасибо всё понял, просто в августе в магистратуру поступаю на прикладное программирование вот и приходиться в тему въезжать
#21
by Draziw
Могу на примере перивести допустим надо создать обработку отрисовки нескольких объектов, объекты разноплановые и единственное что их объединяет - это то что их можно рисовать. Создаем абстрактный класс 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
by megabax
В C#, например, класс может наследовать несколько интерфейсов, а несколько классов не может. Хотя, в C++ пошли другим путем, сделали множественное наследование. А вообще, интерфейс как вариант, применяется там, где надо создать СCOM-объект.
#27
by megabax
Да, действительно, там даже есть такое понятие, как виртуальный класс, что бы он два раза не наследовался.
#28
by Serginio1
Самый простой пример это Stream. Используя единый интерфейс ты можешь читать хоть откуда. Из файла, из WebResponse из базы данных итд
#29
by Jokero
В родительском классе описываются общие методы и переменные для всех потомков. Потом ты можешь в потомке изменить или добавить метод и переменную, а можешь этого и не делать и она спокойно унаследуется к потомку, при этом ее не надо снова описывать.
#30
by Живой Ископаемый
Абстрактные классы и интерфейсы и протоколы - для реализации одних из самых важных паттернов: Фабрика, Абсрактная Фабрика, Делегирование. Для 1Сников. у тебя один абстрактный класс, который говорит что, чтобы класс ему соответсвовал (conforms to), тот должен иметь вот такие-то обязательные свойства и методы. Потом ты например объявляешь процедуру func MyProcedure(SomeInstance: MyProtocol) А когда вызываешь эту процедуру, то уже пишешь: MyProcedure(MyInstanceOfFirstClassConformedToMyProtocol) MyProcedure(MyInstanceOfSeconfClassConformedToMyProtocol) То есть по сути Абстрактный класс ну... помогает абстрагироваться от конкретного типа.
#32
by toypaul
"почему бы сразу не создать класс и в нем не прописать алгоритм методов" - а кто сказал, что так не делают? как раз так и делают. но прописывают "алгоритмы" общие для всех потомков.
#35
by Garykom
как бы 1С-ники пользуются "абстрактными классами" совершенно об этом не задумываясь когда вызывают .Записать; для объекта справочника
#38
by Serginio1
28+ виртуальные методы в отличие от методов интерфейсов наследуются. То есть меньше писанины
#42
by Ненавижу 1С
можно сказать, что класс автоматически реализует "интерфейс имеющий метод Записать", как только у него есть этот метод ))) ну собственно да, утиная типизация и все абсолютно методы виртуальны ))
#45
by Serginio1
В Delphi есть такое понятие как метаклассы. Виртуальный конструктор, виртуальные методы класса class Function StaticVirt:String; virtual;
#46
by Garykom
Попробовал глянуть на эту ветку отстраненно... хуже только математики с их "абстракциями" он в его методе потомка родился...
#48
by Garykom
счего бы? точнее с удовольствием бы забыли но на чем (кроме с++ на котором слишком тормозно писать) можно сделать кроссплатформенный код который не требует туеву тучу фремворков и прочих окружений?
#49
by megabax
Вот в 1С-ке очень ОПП, кстати, не хватает. Как было бы хорошо, если бы когда мне потребовалось написать, например, свою расходную накладную, я типа объявил бы потомка класса РасходнаяНакладная и реализовал бы у нее какие то свои методы.
#50
by Ненавижу 1С
ну почему? реализация метакласса на уровне языка была неплохой, хотя и страдала проблемой - нельзя было сокрыть конструкторы, из-за общего предка TObject
#53
by fisher
Как бы наоборот. Интерфейсы придумали, поглядев на проблемы множественного наследования в С++. Чтобы с помощью них и ряда других инструментов языка можно было безопасно решать задачи, которые в С++ решались множественным наследованием.
#55
by Господин ПЖ
Вот в 1С-ке очень ОПП, кстати, не хватает. 1с тут вполне ООП... у тебя РасходнаяНакладная просто изолирована
#57
by Лефмихалыч
если почтиать мануал какой-нибудь, то ответ там будет дан. Абстрактные классы для того, чтобы просто сгруппировать набор абстрактных методов, которым не нужен ни какой инстанс для работы. Math, например, в C#, - ни какого объекта ему не придумать, а функции его нужны
#61
by Господин ПЖ
>Абстрактные классы для того, чтобы просто сгруппировать набор абстрактных методов, которым не нужен ни какой инстанс для работы для этого есть статика
#64
by ДенисЧ
в с++ нет проблем с множественным наследованием. Они есть у тех, кто не умеет его использовать
#65
by fisher
Для этой задачи вовсе не нужна отдельная сущность. Так что нормальный новичковый вопрос в сабже.
#67
by Shur1cIT
если ООП появиться в 1С, то 1с рынок ларёчников потеряет ибо настройка 1с им станет дороже, так как другого уровня спецы понадобиться.
#73
by Господин ПЖ
>Понятно, что в жаве например все через классы, но это не от хорошей жизни а от какой? зато все единообразно... все перепаковывается в Object
#75
by Лефмихалыч
Абстрактный класс - это интерфейс. Он нужен, чтобы описать поведение для множественного наследования. Множественное наследование имплементации - штука, имеющая право на жизнь и реализуемая, но требующая больше трахотни от производителя компилатора. По этому в современных языках это не модно.
#76
by megabax
Тем что можно создать экземпляр класса, но вот экземпляр модуля с процедурами ты не можешь создать.
#79
by Garykom
там даже проперти нет... как уже задрали эти "геттеры" и "сеттеры" точнее когда на яве долго пишешь то привыкаешь и норм... зато когда с чего то другого возвращаешься...
#80
by Лефмихалыч
+ то есть, если вопрос в том, почему нельзя без них, то ответ - да можно. Заморочек больше просто.
#86
by fisher
Так в этом и проблема. На больших проектах самые разные люди в команду приходят и уходят. Поэтому чем грамотнее сама среда даёт по рукам - тем лучше продукт при прочих равных.
#87
by Asmody
Далось вам это "ООП в 1С". Люди создают новые ЯП вообще без ООП, и ничего, прекрасно развиваются.
#89
by Ненавижу 1С
ну зато и нет проблемы: Obj.MyProperty.Item = 10; ой, а значение Item осталось старым
#90
by Лефмихалыч
конструкию, которая для программиста, смотрящего на исходник, выглядит, как поле класса, но на самом деле компилятором разворачивается в вызов get_ и set методов для доступа к внутреннему сосотянию объекта
#91
by megabax
Вообще то ООП - самая удобная форма программирования. Во всех других подходах приходиться выворачивать мозги наизнанку, классический пример - F#, lisp.
#94
by Господин ПЖ
>Люди создают новые ЯП вообще без ООП, и ничего, прекрасно развиваются. языков тьма, а вакансии все по java/c#/c++/ios/php
#97
by Garykom
не ну я конечно в курсе что на php можно с классами писать... но не одного вживую реально юзаещего (самому пишущего новые) не только готовые фреймворки полбзующего не видал...
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
В этой группе 1С
- Конвертация. ПКО по умолчанию
- СКД как взять результат для дальнейшей обработки.
- Корректировка поступления не попадает в Книгу закупок. КА 1.1.62.2
- Открыть форму на клиенте
- СКД выбор из группы
- Сканер штрих-кода и кодировка 2D кода
- Заполнение таблицы значений управляемая форма
- УПП восстановление последовательности приобретение
- Расхождения ИБ и ленты ФР. Управление торговлей 10.3
- Запись из 1С 8 напрямую в SQL
- Как заполнить реквизиты формы справочника
- 1с8 и NetObjectToIDispatch
- Перенос остатков БП 3.0 - БП 3.0
- СКД Отбор по значениям группировки
- Реквизит параметра в шапку СКД
- соответствие регистров взаиморасчеты и зарплата за месяц
- Как сделать отчет похожий на ПродажиПоМесяцам из БП 3.0 ?
- ЗУП для РК. Регистр расчета.Средний заработок. Неправильно рассчитывается база.
- Как в форме списка документа вывести колонку, которая не является реквизитом?
- Управляемое приложение из обработки вызвать печать документа доп. печатной