Войти
ФлеймФорумПрограммирование

C# - фабричная бяда

Страницы: 1 2 Следующая »
#0
15:58, 17 мая 2019

Есть некоторый класс манагира и класс ресурса, первый порождает инстансы второго.
На крестах мой код выглядел бы так:

class DeviceManager
{
public:

  class Device
  {
    friend class DeviceManager;

  private:

    Device(...);

  public:

    void Close();
  };

  Device* OpenDevice(...);
};

Device* device = manager.OpenDevice(...);
...
device.Close();
Но в шарпее такого не сделать, ибо нет классов - дружков, как быть?


#1
16:03, 17 мая 2019

nes
DeviceManager будет возвращать IDevice, а сам Device - private класс внутри DeviceManager.
Но вообще хрень какая-то :) Я бы лучше Device сделал internal классом сборки.

#2
16:04, 17 мая 2019

Мизраэль
Это не сборка а приложение, не хотелось заморачиваться с ыфейсами, но видимо другого варианта нет (

#3
16:09, 17 мая 2019

nes
> Это не сборка а приложение, не хотелось заморачиваться с ыфейсами, но видимо
> другого варианта нет (
В .NET это в любом случае сборка. Я имел в виду сделать отдельную Class Library. А с интерфейсами стоит заморачиваться, они оставляют значительную гибкость по модернизации кода в дальнейшем и тестирование здорово облегчают.

#4
(Правка: 16:36) 16:27, 17 мая 2019

nes
> Но в шарпее такого не сделать, ибо нет классов - дружков, как быть?
а разве там не namespace видимость повязана, плюс internal

Милостливый Государь, проба пера?

+ Показать
#5
(Правка: 16:45) 16:45, 17 мая 2019

skalogryz
Что мешает в твоём варианте сделать Device d = new Device() ?

#6
16:51, 17 мая 2019

Мизраэль
> Что мешает в твоём варианте сделать Device d = new Device() ?
А зачем запрещать?

#7
(Правка: 16:55) 16:51, 17 мая 2019

Мизраэль
> Что мешает в твоём варианте сделать Device d = new Device() ?
логично.
а так?

public class Device
{
    internal string name;
    public string Name 
    {
      get { return name;}
    }
    
    private Device()
    {
    }
    
    static internal Device NewDevice()
    {
        return new Device();
    }
}

public class DeviceManager
{
    public static Device OpenDevice()
    {
        Device d = Device.NewDevice();
        d.name = "my friend!";
        return d;
    }
}
Функционал является свойством языка
The declaration of the empty constructor prevents the automatic generation of a parameterless constructor. Note that if you do not use an access modifier with the constructor it will still be private by default. However, the private modifier is usually used explicitly to make it clear that the class cannot be instantiated

Dan Diamond
> А зачем запрещать?
чтобы гнустные ручёнки хаков не понаписали.
Вполне норм желание, на самом деле.

#8
16:57, 17 мая 2019

skalogryz
> а так?
Я примерно это и предлагал, только сам Device я бы спрятал за интерфейсом ещё, а сам класс сделал бы internal.

Dan Diamond
> А зачем запрещать?
Убираешь лишние зависимости. В последствии можно подменить один класс другим и на остальной код это никак не повлияет.

#9
(Правка: 17:00) 17:00, 17 мая 2019

Мизраэль
> Я примерно это и предлагал, только сам Device я бы спрятал за интерфейсом ещё,
> а сам класс сделал бы internal.
я хотел показать, что друзья таки есть!

#10
17:46, 17 мая 2019

Мизраэль
> В последствии можно подменить один класс другим и на остальной код это никак не
> повлияет.
Интерфейсы же

#11
23:03, 17 мая 2019

Dan Diamond
> Интерфейсы же
И? Интерфейсы это контракт, понятно, что ты не можешь его нарушить.

#12
0:07, 18 мая 2019

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

#13
23:10, 19 июня 2019

Мизраэль
> DeviceManager будет возвращать IDevice, а сам Device - private класс внутри
> DeviceManager.
> Но вообще хрень какая-то :) Я бы лучше Device сделал internal классом сборки.

Почему хрень? Последнее время так и делаю. У private класс есть гарантия что в этой же сборке его никто не тронет. На душе от этого гармония и покой. И с интерфейсами действительно больше гибкости.

#14
(Правка: 23:43) 23:43, 19 июня 2019

nes
Можешь вместо internal юзать локальный класс внутри класса фабрики. Но чтоб не писать его в том же файле - класс фабрики сделай partial. Тогда класс фабрики у тебя будет в двух файлах. Но в одном файле будет реализация фабрики, а в другом будет локальный класс устройства, интерфейс которого ты возвращаешь.

Ну и без интерфейсов не возвращай ничего из фабрики - тк это дно игростроя.

Страницы: 1 2 Следующая »
ФлеймФорумПрограммирование