Что делает язык Объектно-ориентированным?

Если вы используете Lodash , вы можете сделать следующее:

Импортировать Lodash в ваш компонент.

import * as _ from "lodash";

Объявить переменную-член в компоненте для ссылки на Lodash.

lodash = _;

Тогда, на ваш взгляд, вы можете использовать функцию диапазона . 20 может быть заменен любой переменной в вашем компоненте.

*ngFor="let number of lodash.range(20)"

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

34
задан Community 23 May 2017 в 11:53
поделиться

11 ответов

Определения для Объектной Ориентации , конечно, огромная куча проблем , но здесь составляют мои 2 цента:

мне, Объектная Ориентация - все об объектах, которые сотрудничают путем отправки сообщений. Таким образом, мне, единственной самой важной черте объектно-ориентированного языка.

, Если я должен был поднять заказанный список всех функций, которые должен иметь объектно-ориентированный язык, он был бы похож на это:

  1. Объекты, отправляющие сообщения в другие объекты
  2. , Все - Объект
  3. Позднее связывание
  4. Полиморфизм Подтипа
  5. Наследование или что-то столь же выразительное, как Делегация
  6. Инкапсуляция
  7. Сокрытие информации
  8. Абстракция

, Очевидно, этот список очень спорен, так как это исключает большое множество языков, которые широко расцениваются столь же объектно-ориентированные, такой как Java, C# и C++ , все из которых нарушают точки 1, 2 и 3. Однако нет сомнения, что те языки допускают объектно-ориентированное программирование (но также - C), и даже упростите его (который C не делает). Так, я явился по зову языки, которые удовлетворяют те "чисто объектно-ориентированные" требования.

Как архитипичные объектно-ориентированные языки я назвал бы Сам и Новояз .

Оба удовлетворяют вышеупомянутые требования. Оба вдохновлены и преемники [1 114] Smalltalk, и обоим на самом деле удается быть "большим количеством OO" в некотором смысле. Вещи, которые я люблю приблизительно Сам и Новояз, состоят в том, что оба берут сообщение, отправляющее парадигму до крайности (Новояз еще больше, чем Сам).

В Новоязе, все является сообщением, отправляют. Нет никаких переменных экземпляра, никаких полей, никаких атрибутов, никаких констант, никаких имен классов. Они все эмулированы при помощи методов считывания и методов set.

В Сам, существуют никакие классы , только объекты. Это подчеркивает, о чем OO действительно : объекты, не классы.

30
ответ дан 27 November 2019 в 16:55
поделиться

Архетип

способность выразить реальные сценарии в коде.

foreach(House house in location.Houses)
{
 foreach(Deliverable mail in new Mailbag(new Deliverable[]
              {
              GetLetters(), 
              GetPackages(), 
              GetAdvertisingJunk()
              })
 {
    if(mail.AddressedTo(house))
    {
        house.Deliver(mail);
    }
 }
}

-

foreach(Deliverable myMail in GetMail())
{
    IReadable readable = myMail as IReadable;
    if ( readable != null )
    {
        Console.WriteLine(readable.Text);
    }
}

, Почему?

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

Для достижения этого Вам нужно:

  • Указатели/Ссылки , чтобы гарантировать, что это == это и это! = это.
  • Классы для указания на (например, Рука), которые хранят данные (международная волосатость) и операции (Бросок (IThrowable))
  • Полиморфизм (Наследование и/или Интерфейсы) для обработки конкретных объектов универсальным способом, таким образом, можно прочитать книги, а также граффити на стене (обе реализации IReadable)
  • Инкапсуляция , потому что яблоко не выставляет свойство
Atoms []
-2
ответ дан 27 November 2019 в 16:55
поделиться

К далее, какой сказанный aib, я сказал бы, что язык не действительно объектно-ориентирован, если стандартные библиотеки, которые доступны, не объектно-ориентированы. Самым большим примером этого является PHP. Хотя это поддерживает ориентированные понятия всего стандартного объекта, то, что такой большой процент стандартных библиотек не объектно-ориентирован, означает, что почти невозможно написать Ваш код объектно-ориентированным способом.

не имеет значения, что они представляют пространства имен, если все стандартные библиотеки все еще требуют, чтобы Вы снабдили префиксом все свои вызовы функции материал как mysql_ и pgsql _, когда на языке, который поддерживал пространства имен в фактическом API, Вы могли избавиться от функций с mysql_ и иметь просто простое, "включают system.db.mysql.*" наверху Вашего файла так, чтобы это знало бы, куда те вещи прибыли из.

0
ответ дан 27 November 2019 в 16:55
поделиться

Классы поддержек, методы, атрибуты, инкапсуляция, сокрытие данных, наследование, полиморфизм, абстракция...?

0
ответ дан 27 November 2019 в 16:55
поделиться

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

Видят это обсуждение для обзора того, какие люди думают (мысль?) Средства Объектной ориентации.

Что касается "типичного" языка OO - который является действительно Smalltalk как Kristopher, на который указывают.

1
ответ дан 27 November 2019 в 16:55
поделиться

Согласно Booch, следующим элементам: Главный:

  • Абстракция
  • Инкапсуляция
  • Модульный принцип
  • Иерархия (Наследование)

Незначительный:

  • Ввод
  • Параллелизм
  • Персистентность
9
ответ дан 27 November 2019 в 16:55
поделиться

Smalltalk обычно считают типичным языком OO, хотя Simula часто цитируется в качестве первого языка OO.

Текущие языки OO могут быть свободно категоризированы, которым языком они одалживают большинство понятий у:

  • подобный Smalltalk: Ruby, Objective C
  • подобный Simula: C++, Object Pascal, Java, C#
3
ответ дан 27 November 2019 в 16:55
поделиться

Это не действительно языки, которые являются OO, это - код.

возможно написать объектно-ориентированный код C (со структурами и участниками указателя четной функции, если Вы желаете), и я видел некоторые довольно хорошие примеры его. (Quake 2/3 SDK приходит на ум.) Также определенно возможно записать процедурный (т.е. неOO) код в C++.

, Учитывая, что, я сказал бы, что это - поддержка языка написания хорошего кода OO, который делает это "Объектно-ориентированным языком". Я никогда не беспокоил бы использованием участников указателя функции в структурах в C, например, поскольку, что будет обычными функциями членства; поэтому я скажу, что C не является языком OO.

(Подробно останавливающийся на этом, можно было сказать, что Python не объектно-ориентирован, также с обязательным "сам", ссылка на каждом шаге и конструкторах звонила init, этажерка; но это - Религиозное Обсуждение.)

5
ответ дан 27 November 2019 в 16:55
поделиться

В основном Объектно-ориентированный действительно сводится к "передаче сообщений"

На процедурном языке, я вызываю функцию как это:

  f(x)

И имя f, вероятно, связывается с конкретным блоком кода во время компиляции. (Если это не процедурный язык с функциями высшего порядка или указателями на функции, но позволяет, игнорируют ту возможность в течение секунды.), Таким образом, эта строка кода может только означать одну однозначную вещь.

На объектно-ориентированном языке я передаю сообщение объекту, возможно, как это:

 o.m(x) 

В этом случае. m не является названием блока кода, но "селектором метода" и какой блок кода называют, на самом деле зависит от объекта o в некотором роде. Эта строка кода является более неоднозначной или общей, потому что это может означать разные вещи в различных ситуациях, в зависимости от o.

В большинстве языков OO, объект o имеет "класс", и класс определяет, какой блок кода называют. На нескольких языках OO (наиболее заметно, JavaScript) o не имеет класса, но присоединил методы непосредственно к нему во времени выполнения или наследовал их от прототипа.

Мое разграничение состоит в том, что ни классы, ни наследование не необходимы, чтобы языком было OO. Но эта полиморфная обработка сообщений важна.

, Хотя можно фальсифицировать, это с указателями функции в говорит, что C, это не достаточно, чтобы C назвали языком OO, потому что Вы оказываетесь перед необходимостью реализовывать свою собственную инфраструктуру. Можно сделать это, и стиль OO возможен, но язык не дал его Вам.

9
ответ дан 27 November 2019 в 16:55
поделиться

Игнорируя теоретические последствия, это, кажется,

"Любой язык, который имеет ключевое слово, названное 'классом'" :-P

0
ответ дан 27 November 2019 в 16:55
поделиться

Когда вы можете делать классы, он ориентирован на объект
Например: Java ориентирован на объект, JavaScript нет, а C ++ выглядит как какой-то «объектный любопытный» язык

0
ответ дан 27 November 2019 в 16:55
поделиться