LINUX.ORG.RU

Типы и классы

 


0

1

Мне кажется, что если мы введем следующие ограничения для классов:

1 иммутабельность

2 запрет суперклассов

, то мы получим типы. Иными словами, типы, с точки зрения семантики, являются частным случаем классов. Разумеется, я тут не рассматриваю вопросов статической проверки, только семантика. Так ли это?

Ответ на: комментарий от ox55ff

Поколение экспертов-википедиков плавно сменяется поколением чатжптшников, которые даже на википедию не заходят, зачем?

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)

то мы получим типы. Иными словами, типы, с точки зрения семантики, являются частным случаем классов.

Чтобы яснее было о чем речь, приведите пример кода.

Кто нибудь понял о чем ТС хочет сказать?

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)

типы и классы - одно и то же. в общем смысле это описание нечта, имеющего внутреннее состояние и набор операций с экземпляром данного типа(класса).

Тип - более общее название. Класс - чисто оопэшный термин для типа.

alysnix ★★★
()
Ответ на: комментарий от Nervous

Как я это понимаю с точки зрения обычного пользователя, не связанного с IT. Сам по себе class, что это? В простейшем понимании, это просто инкубатор по созданию своих экземпляров. Что обычно является носителем экземпляра класса? Переменная, которая становится типизированной по классу.

В "простейшем понимании", это значит без внутренностей, свойств, методов, наследования, полиморфизма, перегрузок и прочего устройства.

$ class test {}

$ [test].fullname
test

$ $var = [test]::new()

$ $var -is [test]
True

$ $var -is [string]
False

Если в класс добавить статические свойства и методы, то к ним можно обращаться прямо из класса, без создания нового экземпляра. Это и есть класс.

$ class test { static [string] $String = 'My String'; }

$ [test]::String
My String
dmitry237 ★★★★
()
Ответ на: комментарий от dmitry237

В простейшем понимании, это просто инкубатор по созданию своих экземпляров.

не. класс это описание состояния и описание набора операций с экземпляром класса.

создает «экземпляры» не сам класс, а «фабрика обьектов» в том или ином виде по данному ей классу.

в интерпретриуемом языке, если от типизирован, у переменной есть ссылка на дескриптор класса(типа), и при связывании обьекта(который тоже имеет ссылку на свой класс(тип)) с данной переменной, проверяется совместимость этих типов по присваиванию.

а в компилируемых языках - такая проверка делается во время компиляции и «переменная» это просто область памяти.

alysnix ★★★
()
Ответ на: комментарий от alysnix

[тип — это] описание нечта, имеющего внутреннее состояние и набор операций с экземпляром данного типа(класса)

Я бы сказал — множество допустимых значений, на котором могут быть определены некоторые операции.

Иметь состояние (менять значение отдельного экземпляра, сохраняя его идентичность) не обязательно. Экземпляры многих типов вообще не обладают идентичностью, если на то пошло. Не имеет ведь смысла говорить, что вот эта операция меняет значение экземпляра типа «целое число» 3 на семь. Число 3 всегда число 3.

Класс же ас ин жаба класс — это все эти понятия, сваленные в кучу: и описание экземпляра типа, и описание операций над ними, и управление состоянием (и кое-что сверх этого — например, наследование). Напоминает картинку из допотопных интернетов с геймерским креслом, оборудованным холодильником и унитазом. Ну а чо, зато все под рукой, удобно.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 5)

Иными словами, типы, с точки зрения семантики, являются частным случаем классов.

Наоборот. Класс — частный случай типа.

hobbit ★★★★★
()

Система типов — это синтаксический метод доказательства отсутствия в программе определенных видов поведения при помощи классификации выражений языка по типам вычисляемых ими значений.

Класс это частный случай типов.

Psilocybe ★★★★
()
Последнее исправление: Psilocybe (всего исправлений: 1)

Класс - это тип объекта.

Объект характеризуется набором атрибутов. В программировании, у класса кроме атрибутов (свойств) есть ещё и методы.

Набором атрибутом обычно определяется т.н. «состояние» объекта.

По-крайней мере, такие определения раньше были в курсе диалектического материализма в советское время (если касаться только объектов материального мира).

i_am_not_ai
()
Ответ на: комментарий от Nervous

Число 3 всегда число 3.

Число 3 это и есть состояние типа «число».

Не имеет ведь смысла говорить, что вот эта операция меняет значение экземпляра типа «целое число» 3 на семь

Конечно имеет смысл. Потому что тип именно «целое число», а не «число 3».

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Число 3 это и есть состояние

То есть могут существовать несколько экземпляров числа 3, и у каждого значение может быть разным в разные моменты времени? Любопытненько. А как ты их друг от друга отличаешь? А как определяешь, что это именно число 3, если у него значение 7?

состояние типа «число».

состояние типа

Што. Может, все-таки значение (value) типа число? %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от Nervous

могут существовать несколько экземпляров числа 3, и у каждого значение может быть разным в разные моменты времени

Ну как бы да, прикинь

int a = 3
int b = 3

это внезапно разные инстансы целого. Оба имеют состояние «3».

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

int a = 3

int b = 3

это внезапно разные инстансы целого. Оба имеют состояние «3».

То есть ты не понимаешь, чем переменная отличается от значения, которое в ней лежит? Это тебя лиспом так приложило? %)

Переменная — это не экземпляр типа, это только имя для экземпляра. Состояние, которое переменная собой представляет — это последовательность значений, которые связаны с ее именем, во времени. Если она изменяемая, конечно, иначе это просто имя для одного значения на все время жизни программы.

Значение, вообще говоря, имя иметь не обязано. Вот есть сферическое в вакууме выражение (+ 1 2 3). Имя здесь вообще есть только у функции, остальные значения безымянные, как и значение самого выражения.

Ты самому числу 3 попробуй значение поменять, да. Ну там 3 = 7 или как там у вас принято.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 6)
Ответ на: комментарий от Nervous

Переменная — это не экземпляр типа, это только имя для экземпляра

И что? Когда ты пишешь

Integer a = new Integer(3)
Integer b = new Integer(3)

это одинаковые экземпляры что-ли?

Ты самому числу 3 попробуй значение поменять, да

Само число 3 это литерал, дядя. Попробуй

{ int a = 3 } 

значение поменять. Не свойству объекта, а объекту целиком.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от Nervous

Так это и не числа, это экземпляры типа

И что? Если ты рассуждаешь о сферическом в вакууме классе/типе целых чисел, то какая разница как конкретно он реализован? Если мы говорим в терминах ООП, то int a это переменная с экземпляром класса, под этот экземпляр выделено место и туда записано какое-то значение (например 3). Даже технически 3 может быть просто сахарком для Integer(3). И во многих скриптовых языках это так и есть.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

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

Я не о реализациях вообще, а о концептуальной разнице между именами, значениями и состояниями. Это все не одно и то же, хотя, конечно, в некоторых реализациях может быть смешано до однородной коричневой и дымящейся консистенции %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от pathfinder

Вот уж реально поддерживаю этого оратора. В разных языках ООП понимают очень по разному, где-то классы это вообще интерфейсы, а не структуры(например haskell). Так что попытки автора рассуждать о каком-то абстрактном ООП в вакууме абсолютно бессмысленны.

Aswed ★★★★★
()

Не претендую на истину, но я так классифицирую:

  • Типы это то что существует в Compile Time
  • Классы это то что существует в Runtime и Compile Time

Например есть класс List, но в compile time он может быть записан с параметризацией List<String> – это уже тип. Мы бы могли его записать и без параметризации – List и это тоже тип, только тип может содержать больше информации для компилятора.

Или вот тип int или float, они существуют для компилятора, но в runtime это всего навсего 4 байта по адресу памяти, без какой-либо мета-информации. Только компилятор следит за контрактом что с этими 4-мя байтами мы работаем именно как с числом определенного типа.
В момент исполнения мы не можем определить тип объектов, но описание структуры некоторых объектов мы можем получить из их классов.

Потому я думаю не типы являются частным случаем классов, а классы являются частным случаем типов.

Aber ★★★★★
()
Последнее исправление: Aber (всего исправлений: 3)
Ответ на: комментарий от Aswed

В разных языках ООП понимают очень по разному, где-то классы это вообще интерфейсы, а не структуры(например haskell).

Тайпклассы — это не ООП-классы и не ООП-интерфейсы.

korvin_ ★★★★★
()