
F01134H
19.01.2017
20:13:48
потому что они более строгие

Evgeniy
19.01.2017
20:13:57
ну интерфейсы лучше
но и абстрактные классы тоже хоро
есть им применения

Google

Evgeniy
19.01.2017
20:14:12
привести пример?

F01134H
19.01.2017
20:14:26
да я уже на php.net глянул)

Evgeniy
19.01.2017
20:16:31
там что то не очень пример)

?
19.01.2017
21:52:31
родственник того самого?

Дуров
19.01.2017
21:52:42
нет )


Sergey
20.01.2017
05:46:19
на самом деле обсуждаемую тут проблему можно сильно упростить
1. У любого объекта есть интерфейс.
2. объекты имеют типы
3. Интерфейс как сущность (или полностью абстрактные виртуальные классы в плюсах) нужны были что бы в языках со статической типизацией (java например) можно было юзать late binding (не пустать с поздним статическим связыванием). А это одна из самых важных в ООП техник.
абстрактные классы впихнули уже затем что бы реализацию можно было какую-то в базовый тип запихнуть
но алгоритм должен быть что-то в духе:
- если мы пока не знаем как это что-то будет работать но это что-то нам уже надо и мы можем зарегламентировать интерфейс взаимодействия с этим чем-то, фигачим интерфейсик. Реализации потом придумаем.
- Если нам нужна строго одна реализация и никогда не будет ситуации когда реализацией может быть несколько (сервисы уровня приложения как пример, что-то что регламентирует тупо последовательность действий например) - фигачим просто объект (класс)
- Если у нас 10 похожих реализаций одного интерфейса, подумаем можно ли все что "общее" вынести в отдельный класс и юзать как зависимость. Если это код настолько тупой что выносить его смысла нет - выносим в абстрактный класс.
то есть в целом больше надо думать штуками вроде "контракты, типы..." нежели "интерфейсы, абстрактные классы, классы"... это уже детали реализации


Rodion
20.01.2017
07:06:18
А класс - это тоже обьект

da horsie
20.01.2017
07:06:38
не везде

Google

Sergei
20.01.2017
07:06:40
в С++ нет
в C# да
там где есть информация о типе и классы - чаще "да" чем "нет"

Rodion
20.01.2017
07:07:29
Ну в js

Sergei
20.01.2017
07:08:12
хз. там можно написать что-то вроде print MyClass.Class.Name ?

Rodion
20.01.2017
07:08:17
Инициализация объекта это вызов функции "обьекта" класса

Sergei
20.01.2017
07:09:06
а там есть такое чтобы у класса был интерфейс предоставляющий всякую метаинформацию?
причем у любого конечно класса
?

Rodion
20.01.2017
07:10:53
Ну без привязки к реализации языком ОО парадигмы - есть тип (контракт), описывает поведение. а есть обьект с состоянием и реализующим поведение

da horsie
20.01.2017
07:12:08
класс != контракт
интерфейс != контракт

Sergei
20.01.2017
07:12:35
тут сам класс бы должен "реализовывать поведение", чтобы класс можно было назвать объектом

da horsie
20.01.2017
07:13:04
в js класс это тоже объект
там все объект, кроме шести скалярных типов

Rodion
20.01.2017
07:13:22
Статические методы класса можно рассматривать как методы "объекта" в глобальной области видимости
Ой

da horsie
20.01.2017
07:14:51
ну наверно да

Rodion
20.01.2017
07:15:13
Есть типы, обьекты, поля и методы. И отношения между ними

Google

Sergei
20.01.2017
07:15:19

Rodion
20.01.2017
07:15:23
Тип, объект и метод образуют свою область видимости

Sergei
20.01.2017
07:15:25
причем совсем

Rodion
20.01.2017
07:15:28
Каждый
Почему?
Я не утверждаю, если че

Sergei
20.01.2017
07:17:43
попробую сформулировать
"каждый класс это объект" я понимаю дослновно как "всякий класс реализует поведение Х (==интерфейс)"
причем это поведение Х - оно у всех всех возможных классов одно и то же.
если это вот выполняется, то я скажу что да, явственно "каждый класс - это тоже объект типа КЛАСС"

Sergey
20.01.2017
07:20:21

da horsie
20.01.2017
07:21:03

Sergei
20.01.2017
07:21:05
в C# например есть методы для доступа к метаинформации - и они для всякого класса одиноковы

Sergey
20.01.2017
07:21:12

Sergei
20.01.2017
07:21:26
вот и я о том же

Sergey
20.01.2017
07:21:26
так же как и в python

da horsie
20.01.2017
07:21:49
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}

Sergey
20.01.2017
07:22:15
module.exports = class Polygon{};
ну то есть разница в том что в языках где есть настоящие классы как сущности, это чисто структурные единицы существующие исключительно в статическом контексте (до компиляции, на уровне исходников)

Google

Sergei
20.01.2017
07:23:43
в JS нет классов. Там есть только объекты
дается мне, это несколько неоднозначное утверждение. если я согу иметь прототип, и сляпать на его основе "сильно походие объякты" - для меня это в общем выглядит как класс.
хотя его и можно модифицировать на лету (как и в питоне, к примеру)

Sergey
20.01.2017
07:24:42
> если я согу иметь прототип, и сляпать на его основе
прототип это тоже объект

da horsie
20.01.2017
07:24:44
если бы у тебя в php вместо class был object ты бы думал что там нет классов и все объект?)
In object-oriented programming, a class is an extensible program-code-template for creating objects, providing initial values for state (member variables) and implementations of behavior (member functions or methods).[1][2] In many languages, the class name is used as the name for the class (the template itself), the name for the default constructor of the class (a subroutine that creates objects), and as the type of objects generated by instantiating the class

Sergei
20.01.2017
07:24:52

da horsie
20.01.2017
07:25:20
as i understand, the Class keyword in JS fits into this definition

Admin
ERROR: S client not available

da horsie
20.01.2017
07:25:38
hence, there are classes in JS

Rodion
20.01.2017
07:25:40
obj = new Class()
==
obj = Class.new()
Не?

Sergey
20.01.2017
07:26:39

da horsie
20.01.2017
07:26:46
почему?

Sergey
20.01.2017
07:26:56
потому что это не шаблон

da horsie
20.01.2017
07:27:09
почему это не шаблон?

Sergey
20.01.2017
07:27:19
секу
дай подумаю над ответом)
> a class is an extensible program-code-template for creating objects
в JS "класс" это ничто иное как именованный конструктор + расширение прототипа
сахар для object.create
то есть у тебя то что описывается как класс УЖЕ объект
а не некий шаблон для пораждения объектов

Google

Sergey
20.01.2017
07:28:36
по сути это такой вот способ объявление объекта нового типа

da horsie
20.01.2017
07:28:37
class is an extensible program-code-template for creating objects, providing initial values for state (member variables) and implementations of behavior (member functions or methods).
ита
к
три составляющие

Sergey
20.01.2017
07:29:07
> providing initial values for state
у тебя нет такой возможности в JS
во всяком случае пока не ввели проперти
у тебя этим занимается конструктор
а конструктор это уже часть объекта а не класса, так как он вызывается уже после того как объект был собран в памяти

da horsie
20.01.2017
07:29:43
1. template for creating objects, 2.providing initial values for state, 3.implementations of behavior

Sergey
20.01.2017
07:29:58
нуууу... ладно, ок
тогда в этом определении нет никакой ценности

da horsie
20.01.2017
07:30:10
все три условия соблюдены

Sergey
20.01.2017
07:30:16
потому что за имплементацию поведения отвечают методы
класс лишь вместилище

da horsie
20.01.2017
07:30:36
ну блин
php: class A{} - это не класс?