powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / модификаторы доступа
4 сообщений из 4, страница 1 из 1
модификаторы доступа
    #40005134
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, доброго времени.

чет туплю, подскажите как лучше реализовать следующую картинку:

есть некий класс Worker c запротекчеными методами Run() и Stop();
и есть некий класс WorkerManager которому позволено:
а) создавать инстансы Worker: типа какой нибудь статический метод CreateNewWorker
б) иметь статический метод Start(Worker instance) который запускает у интанса Run
в) иметь статический метод Stop(Worker instance) который запускает у инстанса Stop

Но при этом ввести ограничение что из любого другого места программы (в той же сборке) невозможно было бы создать инстанс Worker явно или явно вызвать Run у инстанса класс Worker.

То есть все манипуляции с классом Worker разрешено делать только через WorkerManager.
В идеале должно получиться что то типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
internal static class WorkerManager {
   internal static Worker CreateInstance(string cns) {return /*new Worker(cns) or Worker.CreateInstance(cns)*/;}
   internal static void Start(Worker instance) { /* instance.Run() or Worker.Run(instance) or Worker.InvokeSomething(instance, "run") */}
   internal static void Stop(Worker instance) { /* instance.Stop() or Worker.Stop(instance) or Worker.InvokeSomething(instance, "stop") */}
}

/* public / internal / protected internal */ 
class Worker /*:SomeInterface??? */{ blablabla }
}

class Program {
   static void Main(string[] args){
   //    var worker = new Worker(""); --недопустимо
   var worker = WorkerManager.CreateInstance(null); //допустимо
   // worker.Run(); // недопустимо
   WorkerManager.Start(worker); //допустимо
   //worker.Stop(); //недопустимо
   WorkerManager.Stop(worker); // допустимо
}
}



//Классы Program, WorkerManager, Worker находятся в одной сборке. Разносить бы не хотелось

Вариант с рефлексией не рассматриваем. Хотелось бы как то нарисовать картинку через модификаторы доступа, использованием интерфейсов, etc.
...
Рейтинг: 0 / 0
модификаторы доступа
    #40005135
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
Господа, доброго времени.

чет туплю, подскажите как лучше реализовать следующую картинку:

есть некий класс Worker c запротекчеными методами Run() и Stop();
и есть некий класс WorkerManager которому позволено:
а) создавать инстансы Worker: типа какой нибудь статический метод CreateNewWorker
б) иметь статический метод Start(Worker instance) который запускает у интанса Run
в) иметь статический метод Stop(Worker instance) который запускает у инстанса Stop

Но при этом ввести ограничение что из любого другого места программы (в той же сборке) невозможно было бы создать инстанс Worker явно или явно вызвать Run у инстанса класс Worker.

То есть все манипуляции с классом Worker разрешено делать только через WorkerManager.
В идеале должно получиться что то типа
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
internal static class WorkerManager {
   internal static Worker CreateInstance(string cns) {return /*new Worker(cns) or Worker.CreateInstance(cns)*/;}
   internal static void Start(Worker instance) { /* instance.Run() or Worker.Run(instance) => которое транслируется в instance.Run() or Worker.InvokeSomething(instance, "run") */}
   internal static void Stop(Worker instance) { /* instance.Stop() or Worker.Stop(instance) or Worker.InvokeSomething(instance, "stop") */}
}

/* public / internal / protected internal */ 
class Worker /*:SomeInterface??? */{ blablabla }
}

class Program {
   static void Main(string[] args){
   //    var worker = new Worker(""); --недопустимо
   var worker = WorkerManager.CreateInstance(null); //допустимо
   // worker.Run(); // недопустимо
   WorkerManager.Start(worker); //допустимо
   //worker.Stop(); //недопустимо
   WorkerManager.Stop(worker); // допустимо
}
}



//Классы Program, WorkerManager, Worker находятся в одной сборке. Разносить бы не хотелось

Вариант с рефлексией не рассматриваем. Хотелось бы как то нарисовать картинку через модификаторы доступа, использованием интерфейсов, etc.


тьфу ты блин. хотел нажать "изменить" а тыкнул походу новое сообщение.

p.s. я знаю, что возможно архитектурно такой подход в целом изначально неверный, но просто интересно какие могут быть воркароунды
...
Рейтинг: 0 / 0
модификаторы доступа
    #40005325
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть модификатор "internal protected", конструктор класса может быть internal, так вы сделайте ограничение на инстанцирование типа только из вашей сборки
...
Рейтинг: 0 / 0
модификаторы доступа
    #40005351
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

вынести публичный контракт Woker в public-интерфейс (разумеется, мтодов Run/Stop там не должно быть). Саму реализацию сделать internal, WorkerManager разместить в той же сборке, он будет приводить интерфейс к internal-классу, и работать с ним. Вне сборки отдается только паблик-интерфейс. Как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
namespace ClassLibrary1
{
  public interface IWorker
  {
    void DoSome();
  }

  internal class Worker : IWorker
  {
    public void DoSome()
    {
      throw new NotImplementedException();
    }

    protected internal void Run(){}
    protected internal void Stop(){}

    internal Worker(string cns) { }
  }

  public static class WorkerManager
  {
    public static IWorker CreateInstance(string cns) => new Worker(cns);
    public static void Start(IWorker instance) => ((Worker) instance).Run();
    public static void Stop(IWorker instance) => ((Worker) instance).Stop();
  }
}

using ClassLibrary1;

namespace test2
{
  public class Program
  {
    public static void Main(string[] args)
    {
      var worker = WorkerManager.CreateInstance("foo");
      WorkerManager.Start(worker);
    }
  }
}


Roman Mejtes
есть модификатор "internal protected"

только не стоит забывать, что этот модификатор означает не "protected AND internal", а означает "protected OR internal". Соответственно, если тип содержит internal protected мембера, и сам тип является public, то отнаследовавшись от этого типа можно легко обращаться к мемберам с таким типом доступа.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / модификаторы доступа
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]