powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Отличие абстрактных типов данных (АТД) от классов в ООП
25 сообщений из 33, страница 1 из 2
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37239734
svnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем собственно разница АТД от классов? В АТД мы все определяем через операции, но ведь в классах тоже так делается. По крайней мере, в классах можно так сделать, когда детские классы определяют новые операции на родительских классах.

Может разница в том, что АТД это всегда значения (передаются по значению), а экземпляры классов это объекты (передаются по ссылке)? Но вроде ООП не определяет явно, являются будут ли экземпляры классов значениями или объектами. Да и не ясно, являются ли элементы данных в АТД всегда значениями или они могут быть объектами (передаваться по ссылке)?

Если кто-то слышал что-то про АТД, то может прояснит эти вопросы?
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240317
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnv,

svnv,

в первую очередь расширяемостью. если в ООП легко добавлять новый типы, но трудно добавлять новый функции, то в АТД наоборот - новую ф-ю добавить легко, а расширить тип гораздо труднее.

демонстрирую.

есть библиотечный классы:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 abstract   class  A {
    int  x();
    int  y();
}

 class  B  extends  A {
   int  x() {  return   1 ; }
   int  y() {  return   2 ; }
}

 class  B  extends  A {
   int  x() {  return   3 ; }
   int  y() {  return   4 ; }
}

добавить в иерархию нового наследника легко:
Код: plaintext
1.
2.
3.
 class  D  extends  A {
   int  x() {  return   1 ; }
   int  y() {  return   4 ; }
}
а вот для добавления новой ф-и придется переписать все предыдущие классы.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240330
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnv,


а с АТД все наоборот.

Есть

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type A = B
          | C

x arg = match arg with
        B ->  1 
        C ->  3 

y arg = match arg with
       B ->  2 
       C ->  4 

теперь добавить новую ф-ю леко:
Код: plaintext
1.
2.
3.
z arg = match arg with
       B ->  9 
       C ->  8 
а вот для при расширении типа, придется переписывать все предыдущие ф-и.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240345
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще одно из важных отличий - инкапсуляция.
В ООП, принято скрывать данные от пользователя, и давать к ним доступ только через интерфейс, в то время как АТД данные не скрывают.



далее если говорить про изменяемое состояние.
в ООП, объект может менять состояния, в то время как объект построенный посредством АТД - неизменяемый.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240358
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnv Да и не ясно, являются ли элементы данных в АТД всегда значениями или они могут быть объектами (передаваться по ссылке)?

могут передаваться по ссылке в некоторых языках. Например в языке F#:

[SRC[
type A = B | C

let x = B //по значению
let rx = ref B//по ссылке
/SRC]
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240428
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и забыл про диспетчеризацию по нескольким типам.

type A = B | C
type D = E | G

f x y = match (x,y) with
(B, E) -> ...
(B, G) -> ...
(C, E) ->
(C, G) ->


из ОО языков я такое видел только в лиспе с его мультиметодами.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240563
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNв то время как АТД данные не скрывают.Немного спорно.

http://ru.wikipedia.org/wiki/%C0%E1%F1%F2%F0%E0%EA%F2%ED%FB%E9_%F2%E8%EF_%E4%E0%ED%ED%FB%F5
авторВся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции.


Вообще, по сути - когда мы применяем готовые объекты - то работаем с ними как с АТД, вызывая только public методы.

А если пишем свой класс (возможно, отнаследованный) - то уже ООП.

ZyK_BotaNв ООП легко добавлять новый типы, но трудно добавлять новый функции
Это где как. )
Код: plaintext
1.
String.prototype.trim = function() { ... };
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240573
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечZyK_BotaNв то время как АТД данные не скрывают.Немного спорно.

http://ru.wikipedia.org/wiki/%C0%E1%F1%F2%F0%E0%EA%F2%ED%FB%E9_%F2%E8%EF_%E4%E0%ED%ED%FB%F5

[/src]

блин, не заметил что в заголовке про Абстрактные типы данных. я писла про Алгебраические типы данных:

http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5



пуская автор ответит что он имел ввиду под АТД.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240710
svnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNsvnv,
в первую очередь расширяемостью. если в ООП легко добавлять новый типы, но трудно добавлять новый функции, то в АТД наоборот - новую ф-ю добавить легко, а расширить тип гораздо труднее.

добавить в иерархию нового наследника легко:
Код: plaintext
1.
2.
3.
 class  D  extends  A {
   int  x() {  return   1 ; }
   int  y() {  return   4 ; }
}
а вот для добавления новой ф-и придется переписать все предыдущие классы.
Зачем переписывать? Берем просто и добавляем новую функцию:
Код: plaintext
1.
2.
 class  D  extends  A {
   int  z() {  return   5 ; }
}


ZyK_BotaN
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type A = B
          | C

x arg = match arg with
        B ->  1 
        C ->  3 

y arg = match arg with
       B ->  2 
       C ->  4 


А что означает эта запись? Я так понял, что сперва мы определяем два новых типа B и С на основе A. А далее я так понимаю мы определяем две новых функции, которые для B и C выдают соответствующие значения.

Ну и не ясно, зачем переписывать все предыдущие функции, если хочется расширить эти типы?

Вообще, я не очень понимаю разницу между АТД и классами в ООП, поскольку отличия похоже только синтаксические, и заметить их можно только в удобстве использования для тех или иных задач. Ведь и там и там мы определяем какие-то данные и далее какие-то действия над ними. Например, стек можно реализовать почти одинаково хорошо через АТД и ООП. Более того, обе реализации выставляются как достижения этих подоходов, тогда как отличия только синтаксические.

Если предположить, что АТД растет из ФП, тогда элементы это по идее значения (в смысле неизменяемы и т.п.), тогда как в ООП элементы обычно объекты (в смысле передаются по ссылке, изменяемы и т.п.) Я готов это принять, поскольку это действительно важно. Но ведь в обоих случаях есть исключения и поэтому не ясно, в чем тогда фундаментальная разница.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240736
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvЗачем переписывать? Берем просто и добавляем новую функцию:
Код: plaintext
1.
2.
 class  D  extends  A {
   int  z() {  return   5 ; }
}


эээ не. я про добавление полиморфной ф-и котороя может работать со всеми наследниками класса A.

svnvZyK_BotaN
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
type A = B
          | C

x arg = match arg with
        B ->  1 
        C ->  3 

y arg = match arg with
       B ->  2 
       C ->  4 


А что означает эта запись? Я так понял, что сперва мы определяем два новых типа B и С на основе A. А далее я так понимаю мы определяем две новых функции, которые для B и C выдают соответствующие значения.


нет, мы объявляем один Алгебраический Тип Даных, который предлагает три альтернативных конструктора.
ф-и определенные для этого типа, должны корректно работать для всех конструкторов.

svnvНу и не ясно, зачем переписывать все предыдущие функции, если хочется расширить эти типы?


отлично, давай расширим тип:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type A = B
          | C
          | D

x arg = match arg with
        B ->  1 
        C ->  3 

y arg = match arg with
       B ->  2 
       C ->  4 

что будет результатом выражения:
Код: plaintext
1.
x D
?


svnvВообще, я не очень понимаю разницу между АТД и классами в ООП, поскольку отличия похоже только синтаксические, и заметить их можно только в удобстве использования для тех или иных задач.

я тебе указал на явные отличия, а ты поленился их осознать.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240738
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnv,

и уточни, где ты вычитал про АТД. может мы про разные вещи говорим.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240743
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN
нет, мы объявляем один Алгебраический Тип Даных A, который предлагает два альтернативных конструктора(B и C) .
ф-и определенные для этого типа, должны корректно работать для всех конструкторов.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240753
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сабжу
Класс - вид атд
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240764
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_LamerПо сабжу
Класс - вид атд

если автор не ошибся и пот АТД имел ввиду Абстрактный Тип Данных, то да.

но я подозреваю что речь о Алгебраических Типах Данных. Я часто замечал что их путают.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240767
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNSQL_LamerПо сабжу
Класс - вид атд

если автор не ошибся и пот АТД имел ввиду Абстрактный Тип Данных, то да.

но я подозреваю что речь о Алгебраических Типах Данных. Я часто замечал что их путают.
действительно, тогда х.з., что автору надо :)

ты пхп выучил ? :)
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240771
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_Lamerдействительно, тогда х.з., что автору надо :)

ты пхп выучил ? :)

боюсь что не понравится
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240793
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNSQL_Lamerдействительно, тогда х.з., что автору надо :)

ты пхп выучил ? :)

боюсь что не понравится
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240806
svnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_LamerПо сабжу
Класс - вид атд
Т.е. АТД это больше теория или видение, которая предполагает разные реализации, а классы (в ООП) это одно из воплощений? Ну тогда в чем специфика классов, если сравнивать с теорией АТД, и какие есть другие виды АТД кроме классов?

Я почему-то думал, что АТД это что-то тесно связанное с ФП, а значит это все о функциях и значениях, а потому не есть ООП, а отсюда следует, что на Яве мы с АТД работать не можем. Где здесь ошибка?
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240818
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot svnv]SQL_LamerЯ почему-то думал, что АТД это что-то тесно связанное с ФП

Я уже 2 раза упоминал в этом топике:
Алгебраические Типы Данных - связано с ФП.
Абстрактные Типы Данных - теория.

ты где встретил эту аббревиатуру ?
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240826
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnv,

Буковы лень писать.
Мне когда - то понравилась книжка "Сруктуры данных в С++" Уильям Топп и Уильям Форд.
Интерестная.
Хочешь - нагугли, прочитай.
Конечно, это не единственный источник.
Просто, первое, подходящее, что в голову пришло.
Или может тебе здесь кто-нибудь в форуме разжует подробно.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240832
Фотография SQL_Lamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot ZyK_BotaN]svnvпропущено...


Я уже 2 раза упоминал в этом топике:
Алгебраические Типы Данных - связано с ФП.
Абстрактные Типы Данных - теория.

ты где встретил эту аббревиатуру ?
ага, че-то он не уточнил
мне чето кажется, что всетаки абстрактные типы данных подразумеваюся
телепатически :)
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240835
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvТ.е. АТД это больше теория или видение, которая предполагает разные реализации, а классы (в ООП) это одно из воплощений? Ну тогда в чем специфика классов, если сравнивать с теорией АТД, и какие есть другие виды АТД кроме классов?

ну вот пример по ссылке из Википедии:

Список. С т.з. АТД в нем есть операции "добавить", "удалить" и прочее.

Т.е. создали список
Код: plaintext
list = new List();

Далее рассмотриваем переменную list как АТД. (напр. list.Add(...); )

Если же у нас нет готового списка, то перед этим заморачиваемся на тему его реализации, т.е. пишем (используя ООП)
Код: plaintext
1.
2.
3.
class List {
 ...
}

Отладив этот класс, далее забываем детали реализации и опять юзаем его экземпляры в стиле АТД.


Другие виды АДТ кроме классов - ну, например, хандл окна в Win32. В программе имеем некий HWND, и применяем к нему функции, понимая, что за этим хандлом прячется реализация, но мы о ней вообще не в курсе.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240840
svnv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNя тебе указал на явные отличия, а ты поленился их осознать.
Ты просто использовал незнакомый язык, в котором я и пытаюсь разобраться.

Код: plaintext
1.
2.
3.
type A = B
          | C
          | D
Это что означает? Мы наверное описываем новый тип A, используя уже существующие типы B, C, D. Что означает "используя" (палка в выражении)? Множественное наследование?

Код: plaintext
1.
2.
3.
x arg = match arg with
        B ->  1 
        C ->  3 
А это что означает? Это похоже на новую функции для нового класса A. Похоже, что функции без аргументов. А дальше "match arg with" не ясно. Функция x вернет 1 для B, и 3 для C. Но эта функция определена внутри D? А где здесь конструкторы о которых ты упоминаешь?
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240844
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL_Lamerага, че-то он не уточнил
мне чето кажется, что всетаки абстрактные типы данных подразумеваюся
телепатически :)

а как же это :

svnvЯ почему-то думал, что АТД это что-то тесно связанное с ФП


мог неправильно расшифровать аббревиатуру.
...
Рейтинг: 0 / 0
Отличие абстрактных типов данных (АТД) от классов в ООП
    #37240856
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvZyK_BotaNя тебе указал на явные отличия, а ты поленился их осознать.
Ты просто использовал незнакомый язык, в котором я и пытаюсь разобраться.

Код: plaintext
1.
2.
3.
type A = B
          | C
          | D
Это что означает? Мы наверное описываем новый тип A, используя уже существующие типы B, C, D. Что означает "используя" (палка в выражении)? Множественное наследование?

нет, мы описываем новый тип А, с конструкторами B, C и D.
в ООП языках для этого можно использовать
абстрактный Класс A и калссы наследники B, C и D.

svnv
Код: plaintext
1.
2.
3.
x arg = match arg with
        B ->  1 
        C ->  3 
А это что означает? Это похоже на новую функции для нового класса A. Похоже, что функции без аргументов. А дальше "match arg with" не ясно. Функция x вернет 1 для B, и 3 для C. Но эта функция определена внутри D? А где здесь конструкторы о которых ты упоминаешь?

это ф-я с одним аргументом arg типа А.
с помощью оператора match определяем конкретный конструктор, и в зависимости от него возвращаем соответствующее значение.

Если констурктор B - то вернем 1, если С - то 3.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Отличие абстрактных типов данных (АТД) от классов в ООП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]