Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/63: Рейтинг темы: голосов - 63, средняя оценка - 4.92
5 / 3 / 2
Регистрация: 27.04.2022
Сообщений: 63

Понимание основ ООП

27.04.2022, 16:33. Показов 16497. Ответов 188
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Начал изучать ООП и сразу возникло непонимание на изучении классов.

У любого класса есть набор своих индивидуальных свойств, но ведь есть и свойства, которые будут общими для всех классов. Например, температура и плотность, если мы говорим о материальных вещах. Да и вообще любые физические и химические свойства для всех материальных вещей будут общими: электропроводность, молярный вес и т. д. Понятно, что они будут иметь различные значения, но фундаментально эти понятия будут едиными для любых классов, выражающих эти самые материальные вещи.

Соответственно, при создании объектов мне необходимо будет для каждого из них задавать свойство, допустим, «Температура» или языки ООП позволяют создать некое «глобальное, общее» свойство и при создании конкретного объекта я смогу присваивать ему это «глобальное» свойство, задавая лишь значение?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2022, 16:33
Ответы с готовыми решениями:

ООП, понимание абстрактных классов/методов и т.п
Работаю программистом и столкнулся с тем, что на проекте отказались от абстрактного класса в пользу интерфейса, но я не совсем понимаю...

Знание основ ООП/Джава
Здравствуйте. Хочу записаться на курсы по Java, но там требование: знание основ ООП/Java. Подскажите, что именно входить в знание основ...

освоение основ
я учусь на инженера программного обеспечения на втором курсе. Нам дают всего по чу-чуть, возникла нужда в самообразовании. Как я выяснил...

188
945 / 120 / 30
Регистрация: 28.11.2018
Сообщений: 304
05.05.2022, 14:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от power_factor Посмотреть сообщение
Вот в том-то и дело, что я сейчас читаю литературу про объектное мышление и там все примеры "Класс-объект" представлены в виде "Транспортное средство - Самосвал", "Млекопитающее - собака", "Человек - Студент" и т. д. То есть примерами из реальной жизни.
Насколько я понимаю, такие примеры придуманы для тех, кто начинает изучение программирования сразу с ООП языков. На мой взгляд, они только запутывают.
Сразу предупрежу - я не считаю себя экспертом в ООП, но, кмк, как тут уже упоминали выше, чтобы лучше объяснить ООП, стоит начать с обычного процедурного программирования и попрограммировать немного без объектов, а потом показать, как объекты меняют ситуацию. Это будет дольше, зато понятнее.
Идея примерно в следующем.
Допустим, у вас есть код, который имеет дело с прямоугольниками. У прямоугольника есть координаты левой верхней вершины и правой нижней. Вы их называете как-нибудь, ну, типа xlu, ylu, xrb, yrb (lu - "left up", rb - "right bottom"). Дальше пишете какое-то количество кода, где эти переменные используются. Вычисляете длины сторон и диагоналей, периметр, площадь, и так далее. Допустим, далее вам нужно код доработать и использовать 3 прямоугольника. Что делать? Ну понятно что: объявляем 12 переменных (xlu1, ylu1, xrb1, yrb1, xlu2, ylu2, ... - ну вы поняли). Также имеет смысл вынести вычисления (площади, периметра, сторон...) в отдельные функции.
Допустим далее, вам нужно еще несколько кругов. Тут тоже понятно: еще пара десятков переменных (xc1, xy1, r1, xc2, yc2, r2, ...), новые функции (recangle_perimeter, circle_perimeter, ...).
И итог: жуткое месиво из десятков переменных, кучи функций, миллион ошибок вида вызова функции с не теми переменными
Pascal
1
l := recangle_perimeter(xlu1, ylu1, xrb1, yrb2);
в результате чего производится мусор в промышленных масштабах.

И тут появляются объекты!
Основная идея - навести порядок. Объявляем структуру "Прямоугольник" с координатами и привязанными к структуре функциями (расчеты периметра, площади и т. п.).
Количество переменных сокращается в четверо. Больше никаких ошибок вида "передали в функцию две координаты одного прямоугольника и две от другого".
Ну и вообще код раскладывается "по полочкам": вот тут - внутренние дела объекта, вон там - все остальное.

Далее, у нас же еще круги были? Создаем класс Shape, и двух наследников - Rectangle и Circle. Допустим, кроме всего прочего, у нас была необходимость вычислять общую площадь всех фигур. Как вам помогут эти классы? Ну можно сделать у класса Shape функцию getArea и переопределить ее у наследников. А использовать следующим образом. Можно создать массив (коллекцию, или другую подобную структуру) объектов типа Shape, помещать в него объекты не типа Shape, a производных типов (Rectangle или Circle), а потом, когда надо просуммировать площади - можно будет пройти по списку и у каждого вызвать метод getArea, который будет по факту работать по-разному у каждого объекта в зависимости от того, что это за объект на самом деле.
Примерно так, на мой взгляд, лучше объяснять ООП.

Цитата Сообщение от power_factor Посмотреть сообщение
Соответственно, при создании объектов мне необходимо будет для каждого из них задавать свойство, допустим, «Температура» или языки ООП позволяют создать некое «глобальное, общее» свойство и при создании конкретного объекта я смогу присваивать ему это «глобальное» свойство, задавая лишь значение?
В любом случае разработка идет так: сначала формулируете задачу, потом подбираете под нее нужные структуры данных. Главное - понимать, как эти структуры работают. ООП это или не ООП - дело десятое. Ваш пример - слишком отвлеченный, на него нельзя дать конкретный ответ.
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
05.05.2022, 16:45
Цитата Сообщение от Shamil1 Посмотреть сообщение
Код, который использует принципы объектно-ориентированного программирования.
Наверное здесь подразумевается, что если есть наследование, то код становится ООП.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
05.05.2022, 20:37
Цитата Сообщение от Shamil1 Посмотреть сообщение
Классы без наследования - это просто "записи", которые к ООП не имеют не больше отношения,
Э-м, нет. Наследование для ООП в общем случае не нужно.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Приведите пример кода с использованием полиморфизма подтипов.
Зачем нужен «полиморфизм подтипов» в ООП?

Добавлено через 13 минут
Цитата Сообщение от Shamil1 Посмотреть сообщение
Пример ОО кода без наследования.
Пожалуйста:

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class cat =
  object
    method greet = print_endline "Meow"
  end
 
class dog =
  object
    method greet = print_endline "Woof"
  end
 
class macos =
  object
    method greet = print_endline "Hello"
  end
 
class pop3_server =
  object
    method greet = print_endline "HELO"
  end
 
let _ =
  [ new cat ; new dog ; new macos ; new pop3_server ]
  |> List.iter (fun friend -> friend#greet)
=>
Code
1
2
3
4
Meow
Woof
Hello
HELO
— https://rextester.com/OOIKM25131

То же самое с явным указанием типа

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class cat =
  object
    method greet = print_endline "Meow"
  end
 
class dog =
  object
    method greet = print_endline "Woof"
  end
 
class macos =
  object
    method greet = print_endline "Hello"
  end
 
class pop3_server =
  object
    method greet = print_endline "HELO"
  end
 
type friend =
  <
    greet : unit
  >
 
let _ =
  ([ new cat ; new dog ; new macos ; new pop3_server ] : friend list)
  |> List.iter (fun friend -> friend#greet)


Добавлено через 4 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
У меня нет моей версии, я использую общепринятую. Если Вам интересно, то можете открыть какой-нибудь учебник (или хотя бы википедию) и почитать.
Автор термина OOP, Alan Key, пишет, что OOP — это message passing and late binding of all things. И ничего про наследование (хотя в первом варианте оно у него упоминалось).

Добавлено через 4 минуты
Цитата Сообщение от korvin_ Посмотреть сообщение
Зачем нужен «полиморфизм подтипов» в ООП?
Конечно, в некотором смысле, в моём примере все классы являются подтипами объектного типа
F#
1
2
3
<
  greet : unit
>
но объявление type friend для этого не обязательно, можно сколько угодно таких типов с любыми именами объявить:

Кликните здесь для просмотра всего текста
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class cat =
  object
    method greet = print_endline "Meow"
  end
 
class dog =
  object
    method greet = print_endline "Woof"
  end
 
class macos =
  object
    method greet = print_endline "Hello"
  end
 
class pop3_server =
  object
    method greet = print_endline "HELO"
  end
 
type friend =
  <
    greet : unit
  >
 
type something =
  <
    greet : unit
  >
 
let _ =
  ([ new cat ; new dog ; new macos ; new pop3_server ] : friend list)
  |> List.iter (fun friend -> friend#greet)
 
let _ =
  ([ new cat ; new dog ; new macos ; new pop3_server ] : something list)
  |> List.iter (fun friend -> friend#greet)


И никакого наследования, при этом.

Добавлено через 33 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
Ваша функция перебирает коллекцию экземпляров различных (никак не связанных между собой) пользовательских типов данных (ПТД), проверяет наличие в текущем ПТД метода с неким именем и (если есть) вызывает его. Где здесь ООП?
В ООП можно объединить различные объекты, никак не связанные между собой, в одну коллекцию. Любому объекту можно отправить любое сообщение, как на него реагировать — решает объект.

И не вижу в том примере проверки на наличие метода с неким именем.

Цитата Сообщение от Shamil1 Посмотреть сообщение
C#
1
2
foreach (var i in list)
{ }
Разве это ООП код?
А так ООП:
C#
1
list.ForEach(i => { })
? Если нет, то как будет ООП?
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
05.05.2022, 21:07
Цитата Сообщение от korvin_ Посмотреть сообщение
Если нет, то как будет ООП?
Господин Shamil1 считает, что без наследования нет ООП. Я так понимаю, что это ему сказал Буч, на основе которого и составлено определение ООП в русскоязычной версии википедии.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
05.05.2022, 21:26
Цитата Сообщение от Tavashi Посмотреть сообщение
Господин Shamil1 считает, что без наследования нет ООП. Я так понимаю, что это ему сказал Буч, на основе которого и составлено определение ООП в русскоязычной версии википедии.
Мне кажется, он путает типы с ООП-классами/объектами, но не буду делать выводы, подожду ответа. )

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

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class A
  on [foo: x bar: y] do
    return x + y
  end
end
 
class B
  on [gee: x] do
    return x * 2
  end
end
 
class C
  on [qux] do
    nothing
  end
end
 
class Logged (object)
  on anyMsg do
    Sys.stdout println "object {object} received message {anyMsg}"
    let reply = object anyMsg
    Sys.stdout println "object {object} respond to message {anyMsg} with {reply}"
    return reply
  end
end
 
class Application
  on [run] do
    let a = Logged.object (A.object)
    let b = Logged.object (B.object)
    let c = Logged.object (C.object)
    ...
  end
end
А уж совсем динамичные позволят навесить такой логгер на вообще все объекты, переопределив корневой класс/объект Object например так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
... // всё что выше, до Application
class Application
  on [run] do
    if (Sys.env "debug") isSet then
      Object = Logged (Object)
    end
 
    let a = A.object
    let b = B.object
    let c = C.object
    ...
  end
end
В статически-типизированных языках такое либо невозможно вообще, либо делается через дичайшие хаки и костыли и предполагает достаточно динамичную реализацию классов и объектов.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
06.05.2022, 01:39
Цитата Сообщение от korvin_ Посмотреть сообщение
Зачем нужен «полиморфизм подтипов» в ООП?
Методы в ООП тоже не нужны? Если не используется полиморфизм подтипов, то методы можно заменить на статические функции.

Цитата Сообщение от korvin_ Посмотреть сообщение
Пожалуйста
Не вижу никакого ООП в этом коде. Весь фокус данного кода в том, что OCalm позволяет создавать разнородные списки без дополнительных ухищрений. ООП в нём не больше, чем в функции print в Haskell, которую можно вызвать для любого deriving Show пользовательского типа данных.

Вот аналог на Haskell:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{-# LANGUAGE ExistentialQuantification #-}
 
class Friend a where
    greet :: a -> String
 
data Cat = Cat deriving (Show)
 
instance Friend Cat where
    greet _ = "Meow"
 
 
data Macos = Macos deriving (Show)
 
instance Friend Macos where
    greet _ = "Hello"
 
-- to create a heterogenous list
data Friendly = forall a . Friend a => Friendly a
 
list = [ Friendly Cat, Friendly Macos ]
 
main :: IO ()
main = print $ map f list
    where
        f (Friendly a) = greet a
Цитата Сообщение от korvin_ Посмотреть сообщение
Автор термина OOP, Alan Key, пишет, что OOP — это message passing and late binding of all things.
Данное значение сейчас не является общепринятым.


Цитата Сообщение от korvin_ Посмотреть сообщение
И не вижу в том примере проверки на наличие метода с неким именем.
Она выполняется неявно. Как и в моём примере:
C#
1
2
foreach (var i in list)
{ }
Цитата Сообщение от korvin_ Посмотреть сообщение
А так ООП
А так ошибка компиляции, если в классе нет метода ForEach.

Цитата Сообщение от korvin_ Посмотреть сообщение
В (настоящем) ООП можно
Такое представление о "настоящем" ООП не совпадает с общепринятым.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
06.05.2022, 02:12
Цитата Сообщение от Shamil1 Посмотреть сообщение
Методы в ООП тоже не нужны?
При чём тут методы?

Цитата Сообщение от Shamil1 Посмотреть сообщение
Если не используется полиморфизм подтипов, то методы можно заменить на статические функции.
Это не связанные вещи. А в ООП нет никаких «статических функций».

Цитата Сообщение от Shamil1 Посмотреть сообщение
Не вижу никакого ООП в этом коде.
Очень плохо, что не видишь. Это самое, что ни на есть ООП.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Весь фокус данного кода в том, что OCalm позволяет создавать разнородные списки без дополнительных ухищрений.
Это не разнородные списки. В Ocaml нельзя сделать список из int и string, например.

Цитата Сообщение от Shamil1 Посмотреть сообщение
ООП в нём не больше, чем в функции print в Haskell, которую можно вызвать для любого deriving Show пользовательского типа данных.
Больше, в Hakell нельзя создать список из значений разных типов, для которых есть реализация тайп-класса Show.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Вот аналог на Haskell:
Это не аналог, ты просто обернул значения типов Cat и Macos в один тип-обёртку — Friendly. Причём напрасно, достаточно было
Haskell
1
list = [ greet Cat, greet Macos ]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Данное значение сейчас не является общепринятым.
Лишь потому что статически-типизированные языки не могут его реализовать в полной мере. Но оно вполне известно.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Она выполняется неявно.
Не факт. Кроме того, различные проверки могут применяться и при разыменовывании указателя на VMT и ссылки на реализацию метода.

Цитата Сообщение от Shamil1 Посмотреть сообщение
А так ошибка компиляции, если в классе нет метода ForEach.
Ну считай, что такой метод есть. Теперь давай по-новой.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Такое представление о "настоящем" ООП не совпадает с общепринятым.
Общепринятого представления не существует. Существует C++/Java/C#-формат, не имеющий прямого отношения к ООП, но эксплуатирующий этот модный в их время термин. Но уже в Python есть свои отличия, а тем более в Ruby. Да даже в Objective-C, более близкому к SmallTalk.

Добавлено через 4 минуты
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вот аналог на Haskell
И это не аналог. В ООП не нужно явно декларировать реализацию какого-то метода. Напиши-ка аналог моего второго примера, с двумя типами:

F#
1
2
3
4
5
6
7
8
9
type friend =
  <
    greet : unit
  >
 
type something =
  <
    greet : unit
  >
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
06.05.2022, 08:37
Цитата Сообщение от Shamil1 Посмотреть сообщение
Данное значение сейчас не является общепринятым.
Почему бы его - общепринятое определение ООП - не описать здесь в теме? Чтобы понимать что именно имеется в виду.

Добавлено через 5 минут
Захожу на русскоязычную версию википедии и в двух местах нахожу записи, которые говорят, что общепризнанного представления ООП как раз нет:
ООП имеет уже более чем сорокалетнюю историю, но, несмотря на это, до сих пор не существует чёткого общепринятого определения данной технологии
Кристофер Дэйт указывает на невозможность сравнения ООП и других технологий во многом из-за отсутствия строгого и общепризнанного определения ООП
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
06.05.2022, 10:45
Цитата Сообщение от Tavashi Посмотреть сообщение
Захожу на русскоязычную версию википедии и в двух местах нахожу записи, которые говорят, что общепризнанного представления ООП как раз нет:
Прочитайте цитаты, которые Вы привели. То, что Вы сейчас написали, ими не подтверждается. В частности, из того, что нет чёткого общепринятого определения, не следует, что нет общепринятого определения.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
06.05.2022, 11:44
Цитата Сообщение от korvin_ Посмотреть сообщение
Это не связанные вещи. А в ООП нет никаких «статических функций».
Поэтому код, написанный с использованием только "статических" функций не является ООП кодом.

Цитата Сообщение от korvin_ Посмотреть сообщение
Это не разнородные списки. В Ocaml нельзя сделать список из int и string, например.
Значит, есть родительский тип, от которого пронаследованы все типы в данном списке. Тогда это ООП код.

Цитата Сообщение от korvin_ Посмотреть сообщение
Это не аналог, ты просто обернул значения типов Cat и Macos в один тип-обёртку — Friendly. Причём напрасно, достаточно было
Не напрасно. В Вашем варианте создаётся список строк (результат вызова одной конкретной функции). В моём варианте создаётся список упакованных объектов, для которых можно вызвать любую фунцию из тайпкласса Friend.

Цитата Сообщение от korvin_ Посмотреть сообщение
Не факт.
Факт.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Main()
{
    foreach (var x in new A())
        Console.WriteLine(x);
}
 
 
public class A 
{
    int position = -1;
    int maxPostion = 3;
 
    public A GetEnumerator() => this;
    public bool MoveNext() => ++position < maxPostion;
    public void Reset() { position = -1; }
    public object Current => position;
}
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
06.05.2022, 17:23
Цитата Сообщение от Shamil1 Посмотреть сообщение
В частности, из того, что нет чёткого общепринятого определения, не следует, что нет общепринятого определения.
Я правильно понимаю, что общепринятое определение есть, но оно нечеткое?
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,827
07.05.2022, 05:03
Простой объект/класс Rectangle, который умеет считать свою площадь, без всякого наследования - это ООП, трудно оспорить такую точку зрения. Разве нет? Инкапсуляция без сокрытия, т.е. объединение под общим именем переменных, функций и других объектов - вот истинный принцип ООП.)))
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
07.05.2022, 13:29
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Простой объект/класс Rectangle, который умеет считать свою площадь, без всякого наследования - это ООП, трудно оспорить такую точку зрения. Разве нет?
C#
1
2
3
4
5
6
7
8
9
10
11
12
void Main()
{
    Rectangle r = new Rectangle(0, 0, 10, 20);
 
    var s1 = Helper.Square(r);
    var s2 = r.Square();
}
 
public static class Helper
{
    public static int Square(this Rectangle r) => r.Width * r.Height;
}
Вы считаете, что в строке 5 не ООП, а в строке 6 уже ООП?


Цитата Сообщение от Mikhaylo Посмотреть сообщение
Инкапсуляция без сокрытия, т.е. объединение под общим именем переменных, функций и других объектов - вот истинный принцип ООП.)))
Почему тогда языки, которые позволяют это сделать, не являются ОО языками?
Visual Basic
1
2
3
4
5
6
7
8
9
10
Option Explicit
Dim Count As Integer
Private Sub Form_Load()
    Count = 0
    Timer1.Interval = 1000 ' units of milliseconds
End Sub
Private Sub Timer1_Timer()
    Count = Count + 1
    Label1.Caption = Count
End Sub
Добавлено через 14 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Since the contents of IExample_Vtbl will never change, we'll
// just declare it static and initialize it that way. It can
// be reused for lots of instances of IExample.
static const IExampleVtbl IExample_Vtbl = {SetString, GetString};
 
IExample * example;
 
// Create (allocate) a IExample struct.
example = (IExample *)GlobalAlloc(GMEM_FIXED, sizeof(IExample));
 
// Initialize the IExample (ie, store a pointer to
// IExample_Vtbl in it).
example->lpVtbl = &IExample_Vtbl;
example->count = 1;
example->buffer[0] = 0;
 
char buffer[80];
 
example->lpVtbl->SetString("Some text");
example->lpVtbl->GetString(buffer, sizeof(buffer));
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
07.05.2022, 18:54
Цитата Сообщение от Shamil1 Посмотреть сообщение
Почему тогда языки, которые позволяют это сделать, не являются ОО языками?
Visual Basic это ОО язык.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
10.05.2022, 18:43
Цитата Сообщение от Tavashi Посмотреть сообщение
Visual Basic это ОО язык.
В примере используется только frm модуль. Раз нет cls модулей, то нет и ООП.

з.ы. Даже в cls модулях не ООП, а неполноценное "псевдо ООП", которое можно "дословно" перевести, например, на Си.
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,827
10.05.2022, 18:53
На основании чего у вас эти языки-то не ОО?))
Си - это ОО-язык без классов (без плюсов).

Сколько версий критериев ОО-языка вы выдвинете, может их классифицируете от псевдо-ОО до full-ОО?

А может нужно просто разобраться в этом достаточно простом вопросе, просто покрутив в голове понятие объекта и определив базовые его свойства?
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
10.05.2022, 20:09
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Си - это ОО-язык без классов (без плюсов).
Haskell у Вас тоже ОО язык без классов?
Или для того, чтобы назвать язык объетно-ориентированным, нужен синтаксический сахар, позволяющий вызывать функции через точку?
C#
1
2
3
4
public static class Helper
{
    public static int Square(this Rectangle r) => r.Width * r.Height;
}
Цитата Сообщение от Mikhaylo Посмотреть сообщение
А может нужно просто разобраться в этом достаточно простом вопросе, просто покрутив в голове понятие объекта и определив базовые его свойства?
В информатике существует понятие OBP (object based programming). Например, Фортран-90.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
10.05.2022, 20:31
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Сколько версий критериев ОО-языка вы выдвинете, может их классифицируете от псевдо-ОО до full-ОО?
Если кратко:

Объектно-ориентированные языки поддерживают все ОО черты: инкапсуляция, наследование, полиморфизм подтипов.

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

Про объектные языки часто говорят "языки с элементами объектно-ориентированного программирования". Хотя, некоторые считают объетные языки объектно-ориентированными. Предположу, что если на собеседовании на вопрос "назовите основные черты ООП" Вы ответите "инкапсуляция и всё", к Вам отнесутся без понимания.
0
821 / 580 / 75
Регистрация: 20.09.2014
Сообщений: 3,827
10.05.2022, 21:19
Собеседование-то ладно, любой может попасться, но можно тыкнуть любого в википедию. Должно быть хоть какое-то объяснение личному мнению... Ну пусть, ладно, это будет лично изобретенная градация О-языков.
0
Модератор
Эксперт функциональных языков программирования
3141 / 2289 / 469
Регистрация: 26.03.2015
Сообщений: 8,920
10.05.2022, 22:35
Цитата Сообщение от Mikhaylo Посмотреть сообщение
Должно быть хоть какое-то объяснение личному мнению...
Это не моё личное мнение. Если Вы не назовёте все три характерные черты ООП, то Ваш ответ посчитают неправильным.

И, специально для Вас, представляю объектно-ориентированный Хаскель:
Haskell
1
2
3
4
5
6
7
x .> f = f x
 
a = [1..10]
 
main =  do
    print $ a.>length 
    print $ a.>map(\x -> x + 1)
Цитата Сообщение от Mikhaylo Посмотреть сообщение
но можно тыкнуть любого в википедию
Ну так откройте в википедии статью object based programming.
А ещё лучше откройте классику. Например, "Concepts, Techniques, and Models of Computer Programming (The MIT Press)".
Или изучите язык Оз.
Язык программирования Oz включает в себя большинство концепций популярных парадигм программирования, в том числе логического, функционального (причём как «ленивые», так и «энергичные» вычисления), императивного, объектно-ориентированного, программирования с ограничениями, распределённого и параллельного программирования. С одной стороны, Oz обладает простой формальной семантикой, а с другой — для него создана эффективная программная реализация.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2022, 22:35

Тесты на знание основ C++
Здравствуйте. Помогите найти тестовые задания по основам программирования на языке с++. Нужно много тестовых заданий (порядка 200-300), по...

Нужны основы основ
Доступ к полям таблиц баз данных FireBird в в среде разработки Builder C++

Разбор основ qt widtgets
Здравствуйте! В первый раз создал qt gui приложение и сразу появилось множество вопросов. Вот код: header.h ...... namespace Ui...

C для изучения основ программирования
Как вы думаете, подходит ли c как язык для изучения основ программирования и погружения в IT сферу. Имею опыт программирования на Python,...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru