вопросы по D
От: Losar Россия  
Дата: 05.06.05 18:58
Оценка:
Привет, forum!
Я недавно стал изучать язык D и у меня возникло несколько вопросов?

1. Как можно скрыть реализацию класса? Т.е. допустим есть класс, который что то делает. я создаю из него библиотеку (lib), как сделать так что бы я мог отдать эту либ и её можно было юзать но, была скрыта реализация класса?
(В си к примеру мы даём заголовки где лежат описание класса и либу, а сами реализация скрыта)

2. Кто может обьяснить (чайнику), что такое mixin и для чего они нужны?
Re: вопросы по D
От: Losar Россия  
Дата: 05.06.05 19:47
Оценка:
И ещё.
Есть ли у класса права доступа к методам и членом класса???? Если да то как использовать?
Re: вопросы по D
От: c-smile Канада http://terrainformatica.com
Дата: 05.06.05 21:06
Оценка:
Здравствуйте, Losar, Вы писали:

L>Привет, forum!

L>Я недавно стал изучать язык D и у меня возникло несколько вопросов?

L>1. Как можно скрыть реализацию класса? Т.е. допустим есть класс, который что то делает. я создаю из него библиотеку (lib), как сделать так что бы я мог отдать эту либ и её можно было юзать но, была скрыта реализация класса?

L>(В си к примеру мы даём заголовки где лежат описание класса и либу, а сами реализация скрыта)

Напиши так:


//myheader.d 
class A {
  void foo();
}

//myimpl.d 
class A {
  void foo() { .... }
}


И отдавай myheader.d

L>2. Кто может обьяснить (чайнику), что такое mixin и для чего они нужны?


Посмотри ветку "Почему D" и
http://rsdn.ru/forum/Message.aspx?mid=1152810&only=1
Автор: c-smile
Дата: 01.05.05
Re[2]: вопросы по D
От: c-smile Канада http://terrainformatica.com
Дата: 05.06.05 21:17
Оценка:
Здравствуйте, Losar, Вы писали:

L>И ещё.

L>Есть ли у класса права доступа к методам и членом класса???? Если да то как использовать?

Как обычно.

Читай доку (она конечно не супер но все есть — её просто нужно прочитать всю):

Protection Attribute

Protection is an attribute that is one of private, package, protected, public or export.
Private means that only members of the enclosing class can access the member, or members and functions in the same module as the enclosing class. Private members cannot be overridden. Private module members are equivalent to static declarations in C programs.

Package extends private so that package members can be accessed from code in other modules that are in the same package. This applies to the innermost package only, if a module is in nested packages.

Protected means that only members of the enclosing class or any classes derived from that class, or members and functions in the same module as the enclosing class, can access the member. Protected module members are illegal.

Public means that any code within the executable can access the member.

Export means that any code outside the executable can access the member. Export is analogous to exporting definitions from a DLL.


http://www.digitalmars.com/d/attribute.html
Re[3]: вопросы по D
От: Losar Россия  
Дата: 06.06.05 09:32
Оценка:
Здравствуйте, c-smile, Вы писали:
CS>Как обычно.
CS>Читай доку (она конечно не супер но все есть — её просто нужно прочитать всю):
CS>

CS>Protection Attribute
CS>Protection is an attribute that is one of private, package, protected, public or export.
CS>Private means that only members of the enclosing class can access the member, or members and functions in the same module as the enclosing class. Private members cannot be overridden. Private module members are equivalent to static declarations in C programs.
CS>Package extends private so that package members can be accessed from code in other modules that are in the same package. This applies to the innermost package only, if a module is in nested packages.
CS>Protected means that only members of the enclosing class or any classes derived from that class, or members and functions in the same module as the enclosing class, can access the member. Protected module members are illegal.
CS>Public means that any code within the executable can access the member.
CS>Export means that any code outside the executable can access the member. Export is analogous to exporting definitions from a DLL.

CS>http://www.digitalmars.com/d/attribute.html

Хммм, почему не работает?
Писал код
class A
{
private int i = 0;
}

int main()
{
A a = new A;
printf("%d\n", a.i);
return 0;
}

всё компилится и рабоатет, не ругается на то что i = private.
почему? что неправильно?
Re[4]: вопросы по D
От: Dusty Россия  
Дата: 06.06.05 10:04
Оценка:
Здравствуйте, Losar, Вы писали:

L>Здравствуйте, c-smile, Вы писали:

CS>>Как обычно.
CS>>Читай доку (она конечно не супер но все есть — её просто нужно прочитать всю):
L>Хммм, почему не работает?
L>Писал код
L>class A
L>{
L>private int i = 0;
L>}

L>int main()

L>{
L>A a = new A;
L>printf("%d\n", a.i);
L>return 0;
L>}

L>всё компилится и рабоатет, не ругается на то что i = private.

L>почему? что неправильно?
Читайте внимательней:

Private means that only members of the enclosing class can access the member, or members and functions in the same module as the enclosing class.

Вынеси main в другой модуль — и работать перестанет...
Re[2]: Поправка
От: Dusty Россия  
Дата: 06.06.05 10:06
Оценка: +1
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Losar, Вы писали:


L>>Привет, forum!

L>>Я недавно стал изучать язык D и у меня возникло несколько вопросов?

L>>1. Как можно скрыть реализацию класса? Т.е. допустим есть класс, который что то делает. я создаю из него библиотеку (lib), как сделать так что бы я мог отдать эту либ и её можно было юзать но, была скрыта реализация класса?

L>>(В си к примеру мы даём заголовки где лежат описание класса и либу, а сами реализация скрыта)

CS>Напиши так:



CS>
CS>//myheader.d 
CS>class A {
export:
CS>  void foo();
CS>}

CS>//myimpl.d 
CS>class A {
export:
CS>  void foo() { .... }
CS>}
CS>


CS>И отдавай myheader.d
Re[5]: вопросы по D
От: Losar Россия  
Дата: 06.06.05 10:31
Оценка:
Здравствуйте, Dusty, Вы писали:

D>Здравствуйте, Losar, Вы писали:


L>>Здравствуйте, c-smile, Вы писали:

CS>>>Как обычно.
CS>>>Читай доку (она конечно не супер но все есть — её просто нужно прочитать всю):
L>>Хммм, почему не работает?
L>>Писал код
L>>class A
L>>{
L>>private int i = 0;
L>>}

L>>int main()

L>>{
L>>A a = new A;
L>>printf("%d\n", a.i);
L>>return 0;
L>>}

L>>всё компилится и рабоатет, не ругается на то что i = private.

L>>почему? что неправильно?
D>Читайте внимательней:
D>

Private means that only members of the enclosing class can access the member, or members and functions in the same module as the enclosing class.

D>Вынеси main в другой модуль — и работать перестанет...

Хммм, как то глупо =).
Может кто знает есть ли студия или какой плагин для разработки программ на D?
Re[6]: вопросы по D
От: c-smile Канада http://terrainformatica.com
Дата: 06.06.05 15:42
Оценка:
Здравствуйте, Losar, Вы писали:

L>Здравствуйте, Dusty, Вы писали:


D>>Здравствуйте, Losar, Вы писали:


L>>>Здравствуйте, c-smile, Вы писали:

CS>>>>Как обычно.
CS>>>>Читай доку (она конечно не супер но все есть — её просто нужно прочитать всю):
L>>>Хммм, почему не работает?
L>>>Писал код
L>>>class A
L>>>{
L>>>private int i = 0;
L>>>}

L>>>int main()

L>>>{
L>>>A a = new A;
L>>>printf("%d\n", a.i);
L>>>return 0;
L>>>}

L>>>всё компилится и рабоатет, не ругается на то что i = private.

L>>>почему? что неправильно?
D>>Читайте внимательней:
D>>

Private means that only members of the enclosing class can access the member, or members and functions in the same module as the enclosing class.

D>>Вынеси main в другой модуль — и работать перестанет...

L>Хммм, как то глупо =).


Почему?
private for module. имхо это удобнее чем
лепить friends в C++ по поводу и без повода.

L>Может кто знает есть ли студия или какой плагин для разработки программ на D?


http://reverie.xrea.jp/wiki/VSpluginD.html
Re[7]: вопросы по D
От: WolfHound  
Дата: 06.06.05 16:33
Оценка:
Здравствуйте, c-smile, Вы писали:

D>>>Вынеси main в другой модуль — и работать перестанет...

L>>Хммм, как то глупо =).
CS>Почему?
По тому что глупо. private должен быть private.
CS>private for module. имхо это удобнее чем лепить friends в C++ по поводу и без повода.
В C# поступили гораздо умнее. Там ввели модификатор internal доткрытый доступ внутри сборки.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: вопросы по D
От: c-smile Канада http://terrainformatica.com
Дата: 07.06.05 00:24
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, c-smile, Вы писали:


D>>>>Вынеси main в другой модуль — и работать перестанет...

L>>>Хммм, как то глупо =).
CS>>Почему?
WH>По тому что глупо. private должен быть private.

Для кого он должен быть private? Для меня — того человека что
пишет этот модуль? А смысл?

CS>>private for module. имхо это удобнее чем лепить friends в C++ по поводу и без повода.

WH>В C# поступили гораздо умнее. Там ввели модификатор internal доткрытый доступ внутри сборки.

Да все что угодно. Слов в английском еще много.
Re[9]: вопросы по D
От: WolfHound  
Дата: 07.06.05 06:02
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Для кого он должен быть private?

Для всех кроме того класса в котором он объявлен. На то он и private чтобы никто своими руками в реализацию не лез.
CS>Для меня — того человека что пишет этот модуль?
Модуль может быть большим. Напиример в одной из сборок того проекта который я сейчас пишу пол метра исходников в 104х файлах.
И пишут его два человека.
CS>А смысл?
Может тогда вобще убрать модификаторы доступа? В чем смысл то?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: вопросы по D
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 07.06.05 06:38
Оценка: 1 (1) :)
CS>>А смысл?
WH>Может тогда вобще убрать модификаторы доступа? В чем смысл то?

Присоединяюсь к вопросу: в чем их смысл то?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[11]: вопросы по D
От: WolfHound  
Дата: 07.06.05 10:12
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

CS>>>А смысл?

WH>>Может тогда вобще убрать модификаторы доступа? В чем смысл то?
ANS>Присоединяюсь к вопросу: в чем их смысл то?
Смысл чего? Модификаторов доступа?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: вопросы по D
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 07.06.05 10:30
Оценка:
CS>>>>А смысл?
WH>>>Может тогда вобще убрать модификаторы доступа? В чем смысл то?
ANS>>Присоединяюсь к вопросу: в чем их смысл то?
WH>Смысл чего? Модификаторов доступа?

угу
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[13]: вопросы по D
От: WolfHound  
Дата: 07.06.05 10:55
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

WH>>Смысл чего? Модификаторов доступа?

ANS>угу
В контроле инкапсуляции компилятором.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Поправка
От: Losar Россия  
Дата: 07.06.05 11:30
Оценка:
Здравствуйте, Dusty, Вы писали:

D>Здравствуйте, c-smile, Вы писали:


CS>>Здравствуйте, Losar, Вы писали:


L>>>Привет, forum!

L>>>Я недавно стал изучать язык D и у меня возникло несколько вопросов?

L>>>1. Как можно скрыть реализацию класса? Т.е. допустим есть класс, который что то делает. я создаю из него библиотеку (lib), как сделать так что бы я мог отдать эту либ и её можно было юзать но, была скрыта реализация класса?

L>>>(В си к примеру мы даём заголовки где лежат описание класса и либу, а сами реализация скрыта)

CS>>Напиши так:



CS>>
CS>>//myheader.d 
CS>>class A {
D>export:
CS>>  void foo();
CS>>}

CS>>//myimpl.d 
CS>>class A {
D>export:
CS>>  void foo() { .... }
CS>>}
CS>>


CS>>И отдавай myheader.d


не работает ?!?!??!
Вот что я делаю.

Есть два файла lib.d и lib_r.d
/*********************************** lib.d **************************************/
class A
{
export
{
this();
~this();
int get();
}
/********************************************************************************/
/*********************************** lib_r.d **************************************/
import std.stdio;
class A
{
export
{
this() { printf("constructor\n"); }
~this() { printf("destructor\n"); }
int get() { return 0; };
}
/********************************************************************************/

далее собираю библиотеку
dmd -c -O -release lid_r.d
lib -c mylib.lib lib_r.obj
получаем mylib.lib

далее есть main.d
/*********************************** main.d **************************************/
import std.stdio;
import lib;

int main()
{
A a = new A();
return 0;
}
/********************************************************************************/
собираю
dmd -O -release -L mylib.lib main.d

он начинает ругатся что типа незнает A;
но если я заменю import lib на import lib_r
все собирается и работает?

Что делать?
Re[14]: вопросы по D
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 07.06.05 11:40
Оценка: :)
Здравствуйте, WolfHound, Вы писали:
WH>>>Смысл чего? Модификаторов доступа?
ANS>>угу
WH>В контроле инкапсуляции компилятором.

Так инкапсуляция либо есть либо нет. А атрибутов много.
Значит в чем то другом дело.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[4]: Поправка
От: Dusty Россия  
Дата: 07.06.05 11:49
Оценка:
L>не работает ?!?!??!
Хм? Странно... Посмотрю дома — отвечу завтра

L>Вот что я делаю.


L>Есть два файла lib.d и lib_r.d

L>/*********************************** lib.d **************************************/
L>class A
L>{
L>export
L>{
L> this();
L> ~this();
L> int get();
L>}
L>/********************************************************************************/
L>/*********************************** lib_r.d **************************************/
L>import std.stdio;
L>class A
L>{
L>export
L>{
L> this() { printf("constructor\n"); }
L> ~this() { printf("destructor\n"); }
L> int get() { return 0; };
L>}
L>/********************************************************************************/

L>далее собираю библиотеку

L>dmd -c -O -release lid_r.d
L>lib -c mylib.lib lib_r.obj
L>получаем mylib.lib

L>далее есть main.d

L>/*********************************** main.d **************************************/
L>import std.stdio;
L>import lib;

L>int main()

L>{
L> A a = new A();
L> return 0;
L>}
L>/********************************************************************************/
L>собираю
L>dmd -O -release -L mylib.lib main.d
А зачем здесь опция -L?

L>он начинает ругатся что типа незнает A;

L>но если я заменю import lib на import lib_r
L>все собирается и работает?
Так-то понятно — она к библиотеке не обращается...

L>Что делать?

Может, я ошибся в совете... Попробуй сделать так:
module mypackage.lib_r
import std.stdio;

export
{
  class A 
  {
    this() { printf("constructor\n"); }
    ~this() { printf("destructor\n"); }
    int get() { return 0; };
  }
}


module mypackage.lib

export
{
  class A 
  {
    this();
    ~this();
    int get();
  }
}

module mypackage.main
import std.stdio;
import lib;

int main()
{
  A a = new A();
  return a.get();
}
Re[15]: вопросы по D
От: WolfHound  
Дата: 07.06.05 11:54
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

WH>>В контроле инкапсуляции компилятором.

ANS>Так инкапсуляция либо есть либо нет. А атрибутов много.
ANS>Значит в чем то другом дело.
Дело в уровнях инкапсуляции.
public — Публичный интерфейс класса.
protected — Интерфейс класса доступный потомкам.
internal — Интерфейс класса доступный внутри сборки.
private — Детали реализации класса.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.