
Oleg
30.01.2017
16:34:19
auto a = new shared A
тогда это будет разделяемая память
и всё как в С/С++

Сергей
30.01.2017
16:35:19
Ясно)
Теперь все логично)

Google

Dmitry
30.01.2017
17:10:08
А можно ли говорить о том, что тип класса и имя класса это одно и тоже?

Max
30.01.2017
18:28:08
Класс — это просто пользовательский тип. Можно сказать что тип класса — класс, лол

0x9d8e
30.01.2017
18:37:03

Dmitry
30.01.2017
18:37:50
@Ivan_0x9d8e не) Max тут правильно ответил
А разве поля в классах в Ди по дефолту публичные?
Как следующйи код тогда работает?
void main()
{
MyClass myclass = new MyClass();
myclass.name = "Jow"; // ???
}
class MyClass
{
string name;
}

Oleg
30.01.2017
18:50:28
По умолчанию да, публичные

Dmitry
30.01.2017
18:52:14
тааак. Вот это новость блин. Тогда получается в Ди как и в шарпе нет особого смысла в структрах если тоже самое можно через классы делать?

Pavel
30.01.2017
18:53:36
Есть тип integer, а есть например тип класса MyClass

Сергей
30.01.2017
19:02:24
и у них разные задачи и область применения

Dmitry
30.01.2017
19:08:18
Как я понимаю они больше нужны для описания данных, в отличие от объектов которые больше содержат методы работы с данными

Сергей
30.01.2017
19:08:57
именно так

Google

Сергей
30.01.2017
19:11:26
Например у тебя может быть структура Vector которая содержит в себе float X Y Z, и умеет производить векторные операции (сложение умножение)
И может быть класс Character который будет в себе содедать Vector для определения позиции, поворота, смещения и тд

Dmitry
31.01.2017
07:52:45
А зачем нужен диструктор если работает GC?

Сергей
31.01.2017
07:54:41
Закрыть handler чтения из файла например

Alexander
31.01.2017
07:55:00
Вызывается при уничтожении объекта. Есть возможность управлять выделением и удалением памяти вручную

Dmitry
31.01.2017
07:59:55
а разве файл не проще в финализаторе закрыть?
Просто как я понимаю деструктор для разных завершений не очень хорошая идея. К примеру мы же там не можем коннект к БД как я понимаю закрывать. Точнее можем, но проблемы могут быть

Сергей
31.01.2017
08:12:42
Разве в D есть финалайзер по типу как в C#?

Dmitry
31.01.2017
08:13:49
Блин а как в C# ? Z думал финализатор это просто метод который вызывается и закрывает все в самом конце

Сергей
31.01.2017
08:16:26
Ну там есть ~деструктор и метод finalize переопределяемый
В чем разница в них я не знаю
А полагаться на деструктор при закрытии соединения плохо наверное потому что ты не знаешь когда сборщик мусора сработает, и сработает ли вообще, может у тебя ссылке сохранена где-то
Но если уж вызвался деструктор, а соединение открыто, то почему бы его не закрыть?
Закрыв сокеты и освободив прочие ресурсы ОС

Dmitry
31.01.2017
10:34:39
Блин, вот вот уже час курю конструкторы. Не могу понять, что делать если в базовом классе есть свой конструктор. Его же тоже нужно инициализировать но чем?

Сергей
31.01.2017
10:36:46
а что у тебя делает класс относледованый от него?
чаще всего темже
например есть у тебя
BaseFileReader(File file)
ты хочешь сделать свой какойто функциона и делаешь
MySuperFileReader(File file) - который вызовает конструктор базового класса

Dmitry
31.01.2017
10:38:27
import std.stdio;
void main()
{
ManClass manClass = new ManClass("Adam");
WomanClass womanClass = new ManClass("Eva");
}
class HumanClass
{
string name;
this(string name)
{
this.name = name;
}
void talk()
{
writeln("Hello");
}
}
class ManClass : HumanClass
{
string name;
this(string name)
{
this.name = name;
}
void job()
{
writeln("doing the job");
}
}
class WomanClass : HumanClass
{
string name;
this(string name)
{
this.name = name;
}
void cook()
{
writeln("Cooking");
}
}
тут явно нужен консруктор базового класса
я никак не могу понять как его правильно вызывать

Eto
31.01.2017
10:40:18

Сергей
31.01.2017
10:40:42
super(name);

Google

Сергей
31.01.2017
10:41:06
ManClass не должен содержать string name;
ну соотвественно и woman тоже

Dmitry
31.01.2017
10:42:42
а если и у того и у другого есть имя, то?

Сергей
31.01.2017
10:42:56
оно определено в базовом классе

Dmitry
31.01.2017
10:43:18
так а его конструктор надо или нет вызывать?

Сергей
31.01.2017
10:44:04
да

Eto
31.01.2017
10:44:13
Кто-нибудь может подсказать чаты по C и Rust?

Сергей
31.01.2017
10:44:14
super(name) в теле конструктора, woman и man

Dmitry
31.01.2017
10:45:40
а из проиводного класса как реализовать базовый?
subClass( ... );
тут же еще как-то надо конструктор базового вызвать

Сергей
31.01.2017
10:46:57
как код вставлять подсвеченый?
class ManClass : HumanClass
{
this(string name)
{
super(name);
}
void job()
{
writeln("doing the job");
}
}

Eto
31.01.2017
10:47:22
Markdown

Eto
31.01.2017
10:47:51
Три `, перед и после блока.

Сергей
31.01.2017
10:48:26
спс

Dmitry
31.01.2017
12:59:45
@BorMor получается, что в main надо вызывать конструктор базового класса или нет?

Сергей
31.01.2017
13:01:32
В мейн не недо
При создании экземпляра класса вызывается конструктор
Пишешь
auto man = new ManClass("Вася");
Вызовется конструктор
ManClass.this(name)
А в нем вызовется
HumancClass.this(name)
Потому что ты написал super(name) - это и вызовет конструктор базового класса

Dmitry
31.01.2017
13:08:10
Короче в каждом производном классе нужно вызывать конструктор базового, так?
class ManClass : HumanClass
{
string name;
this(string name)
{
super(name); // вызывем конструктор базового класса
}
// ....
}

Google

Сергей
31.01.2017
13:08:58
string name;
удали только

Dmitry
31.01.2017
13:09:24
оно само в базовый прокинет?

Сергей
31.01.2017
13:10:05
само ничего не происходит
class HumanClass
{
string name;
this(string name)
{
this.name = name;
}
void talk()
{
writeln("Hello");
}
}
у тебя в базовом конструторе уже есть string name;
это де базовые основы ООП

Dmitry
31.01.2017
13:12:02
так, ну у меня базовый класс так и раелизован. Сейчас весь код покажу

Сергей
31.01.2017
13:12:37
скинь весь листинг в pastebin

Dmitry
31.01.2017
13:12:44
http://paste.ofcode.org/qt4iq5x6kFKX8kcbRLbnc4

Сергей
31.01.2017
13:23:55
http://pastebin.com/7D4RR8cw

Dmitry
31.01.2017
13:25:45
/me читаю

Admin
ERROR: S client not available

Сергей
31.01.2017
13:26:40
но это совсем не показательный пример

Dmitry
31.01.2017
13:37:33
Так, а если производный класс будет требовать конструктор его уже через this без супер вызывать?

Сергей
31.01.2017
13:38:52
не понял вопроса

Dmitry
31.01.2017
13:39:50
Ну к примеру если в конструктор нужно ManClass нужно будет что-то передать

Сергей
31.01.2017
13:41:50
ну вызывать базовый конструктор не всегда обязательно, но часто в этом весь смысл
вот в этом примере вся суть в этом

Dmitry
31.01.2017
13:44:23
Я никак в толк не могу взять как быть если в классе Мужчина тоже нужен конструктор

Сергей
31.01.2017
13:49:50
http://pastebin.com/9XydtSg7

Dmitry
31.01.2017
13:54:11
О, спасибо
так, а если в производном клссе появляется новый метод, то мы его можем вызывать просто:
womanClass.cook(); ?

Google

Сергей
31.01.2017
14:00:06
да

Dmitry
31.01.2017
14:02:00
чnо-то не то

Сергей
31.01.2017
14:02:05
но только если обьявлено вот так
WomanClass womanClass = new WomanClass ("Eva");
если обьявнлено вот так
HumanClass humanClass = new WomanClass ("Eva");
то уже не получится
humanClass.cook();
потому что у тебя в HumanClass нет метода cook()

Dmitry
31.01.2017
14:03:20
Т.е. тогда только абстрактные классы использовать?
Т.е. при простом наследовании нельзя новые методы добавлять?

Сергей
31.01.2017
14:03:57
ну те которые тебе нужны
должен быть класс обстактным, делай абстрактным
ну а как ты хочешь изменить что-то в наследнике, и что бы это как то повлияло на родителя?
это как
Белая женщина родила Черного ребенка, и стала Чернокожей

Dmitry
31.01.2017
14:06:15
Итог при наследовании методы дожны совпадать 1к1 и их допонять нельзя так?

Сергей
31.01.2017
14:06:33
все зависит от того что тебе надо)

Dmitry
31.01.2017
14:07:40
да пока просто понятть что к чему. я в базе плаваю походу

Сергей
31.01.2017
14:08:41
ну если честно то ты не понимаешь смысл ООП, если опыта нет в других языках типа шарпа, явы, с++ то я не знаю что посоветывать,
так бы порекомендовал посмотреть исхоники каки ни будь проектов, что бы понять что и зачем
Я могу тебе попозже набросать какой ни будь пример если нужно?
За одно синтаксис Д посмотрю получше.

Dmitry
31.01.2017
14:16:52
пример бы не помешал, но местами слова тоже важны
Так, после долгих попыток осмыслленя дошло как сделать так чтоб ыработало
Тааак. Кажется даже интерфейсы в голову легли.
Если мы в абстрактном классе реализуем метод:
abstract class Human
{
string name;
void sayHello()
{
writefln("Hello", name);
}
}
То можем ли в унаследованном от него классе писать:
ManClass manClass = new ManClass("Adam");
manClass.sayHello(); // просто у меня упорно выводит просто:
Hello, без name
Как я понимаю поля не могут быть указаны в абстрактном классе?

Сергей
31.01.2017
17:00:00
да можем
@DmitryBubnenkov тут? :)

Dmitry
31.01.2017
18:29:25
@BorMor да