Форум программистов, компьютерный форум, киберфорум
PHP
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Заблокирован

Можно ли сделать метод невидимым только для наследника?

16.08.2024, 12:03. Показов 774. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Класс App расширяется классом RouteCollector, в котором есть метод RouteCollector::getRoutes.

В самом классе App происходит внедрение RouteCollector - new Router($this).

Можно ли сделать метод RouteCollector::getRoutes видимым только внутри Router, чтобы при использовании объекта App уже не было к нему доступа?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2024, 12:03
Ответы с готовыми решениями:

Как сделать открытым свойство для наследника но закрытым для наследника наследника?
Есть класс GameObject в котором есть свойство Coordinates Класс Animal наследуется от GameObject и должен содержать метод MoveTo который...

Можно ли сделать невидимым option(item) в combobox?
Можно ли сделать невидимым option(item) в combobox?

Можно ли сделать фон компонента DBCtrlGrid невидимым?
Помогите пожалуйста. Пробовал ставить AlphaControls, вроде как там есть скин Transparent, но он ничего не дает. Может еще есть какие-то...

6
 Аватар для sad67man
2485 / 1409 / 667
Регистрация: 23.08.2015
Сообщений: 3,558
16.08.2024, 12:20
Лучший ответ Сообщение было отмечено HP Fedora как решение

Решение

HP Fedora, Нельзя, а зачем App наследовать от RouteCollector?
1
Заблокирован
16.08.2024, 12:32  [ТС]
sad67man, чтобы была возможность от App заполнять роуты

PHP
1
2
3
4
5
6
7
$container = new Container();
 
$app = new App($container);
 
$app->get('/', ExampleAction::class); // RouteCollector::get
 
$app->run();
хотел метод получения массива роутов спрятать в месте сборки, сделав его видимым только тут:

PHP
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
class App extends RouteCollector
{
    private array $middleware = [];
 
    public function __construct(
        private readonly ContainerInterface $container
    )
    {
    }
 
    public function getContainer(): ContainerInterface
    {
        return $this->container;
    }
 
    public function run(): void
    {
        $request = new Request();
 
        $router = new Router($this); // хотел чтобы RouteCollector::getRoutes был виден только внутри Router :)
 
        $routeResult = $router->matchRoutes($request);
 
        foreach ($routeResult->getMiddleware() as $middleware) {
            $this->addMiddleware($middleware);
        }
 
        $handler = new Handler($routeResult, $this->container);
 
        $kernel = new Kernel($handler, $this->middleware);
 
        $response = $kernel->handle($request);
 
        $response->send();
    }
 
    public function addMiddleware(string $middleware): void
    {
        $this->middleware[] = $this->container->get($middleware);
    }
}
Добавлено через 5 минут
sad67man, короче я понял суть, я если буду прятать методы, то при другом способе сборки ничего не соберётся, я тогда ограничу сборку только одним способом

ок, порешали
0
 Аватар для sad67man
2485 / 1409 / 667
Регистрация: 23.08.2015
Сообщений: 3,558
16.08.2024, 12:49
Лучший ответ Сообщение было отмечено HP Fedora как решение

Решение

Цитата Сообщение от HP Fedora Посмотреть сообщение
sad67man, чтобы была возможность от App заполнять роуты
Это вы можете сделать без наследования. Просто добавив методы.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class App
{
    public function __construct(
        private Router $router
    )
    {
    }
 
    public function get($path, $handler)
    {
        $this->router->get($path, $handler);
    }
 
    public function post($path, $handler)
    {
        $this->router->post($path, $handler);
    }
}
Цитата Сообщение от HP Fedora Посмотреть сообщение
В самом классе App происходит внедрение RouteCollector - new Router($this).
Это сложно назвать "внедрением".. Лучше когда нет цикличной связанности.
1
Заблокирован
16.08.2024, 12:55  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
Просто добавив методы.
я наоборот хочу их убрать хотя надо по ходу вернуть и не париться, ну если честно я просто пробую по разному собирать, чтобы понять будет ли работать в любом случае

Цитата Сообщение от sad67man Посмотреть сообщение
Лучше когда нет цикличной связанности.
это ещё что, есть навязчивая идея: в RouteCollector у меня есть метод группировки роутов, пока что я внедряю в RouteGroup объект RouteCollector, чтобы группировать методы get-post (свои отдельные методы именно в классе RouteGroup) и так далее, но есть навязчивая идея не передавать в RouteGroup этот объект и не использовать свои методы класса RouteGroup, а наследоваться от RouteCollector и использовать его методы, которые уже в нём есть (в классе RouteCollector создавать экземпляры классов, которые наследуются от RouteCollector)

кстати тоже уже думал, что получится зацикленность ого-го
0
 Аватар для sad67man
2485 / 1409 / 667
Регистрация: 23.08.2015
Сообщений: 3,558
16.08.2024, 14:31
Цитата Сообщение от HP Fedora Посмотреть сообщение
PHP
1
2
3
4
5
6
7
$container = new Container();
 
$app = new App($container);
 
$app->get('/', ExampleAction::class); // RouteCollector::get
 
$app->run();
Странное использование контейнера. Обычно как-то наоборот
PHP
1
$app = $container->get(App::class);
Есть принцип Inversion of Control, IoC, который служит для уменьшения связанности компонентов системы между собой.
DI Container - это одна из реализаций этого принципа. К примеру App использует Роутер, но не знает как его создавать и какие дополнительные зависимости ему нужны.

Цитата Сообщение от HP Fedora Посмотреть сообщение
кстати тоже уже думал, что получится зацикленность ого-го
Этим многие по началу страдают, пишут код - будто составляют кроссворд, считая, что чем меньше кода и больше переплетений - тем лучше.

Я уже писал, что один из серьезных критериев оценки - простота написания и поддержка тестов. Если вы не собираетесь покрывать свое чудо unit-тестами, то дальнейшее рассуждения лишены смысла. Мы будем говорить о неком сферическом коне в вакууме. И вы все равно будете делать по своему, не понимая разницы.
0
Заблокирован
17.08.2024, 06:05  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
К примеру App использует Роутер, но не знает как его создавать и какие дополнительные зависимости ему нужны.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$container = new Container();
 
$settings = require __DIR__ . '/../app/settings.php';
$settings($container);
 
$services = require __DIR__ . '/../app/services.php';
$services($container);
 
$app = new App($container);
 
$routes = require __DIR__ . '/../app/routes.php';
$routes($app);
 
$middlewares = require __DIR__ . '/../app/middleware.php';
$middlewares($app);
 
$app->run();
всё просто

можно даже блатануть

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
chdir('..');
 
spl_autoload_register(function ($class) {
    $file = str_replace('\\', '/', lcfirst($class)) . '.php';
 
    if (file_exists($file)) {
        require $file;
    }
});
 
$container = new Container();
 
require 'app/settings.php';
require 'app/services.php';
 
$app = new App($container);
 
require 'app/routes.php';
require 'app/middleware.php';
 
$app->run();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.08.2024, 06:05
Помогаю со студенческими работами здесь

Можно ли переопределять в PHP метод у наследника, так, чтобы менялся возвращаемый тип?
Добрых суток! Можно ли переопределять в PHP метод у класса-наследника, так, чтобы менялся возвращаемый тип, если да - то как ? ...

Можно ли текст в <textarea> сделать невидимым так, чтоб курсор остался?
Подскажите, пожалуйста, можно ли текст в &lt;textarea&gt; сделать невидимым так, чтоб курсор остался?

Метод для наследника
В функции, в сигнатуре которой одним из принимаемых параметров является объект родитель, передаю объект потомок. Как я могу узнать какой...

Сделать элемент невидимым для DOM-дерева
Потребовалось добавить элемент уже в готовую структуру, а у меня уже все удобно работало методами children.eq(i), parent. Грубо говоря...

Сделать textbox невидимым для проверки на заполненность ячеек
подскажите пожалуйста у меня куча textbox на форме надо чтобы на форме с одной textbox происходило вот такое если в listbox выбираю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как создать стек в Python
AI_Generated 05.06.2025
Как архитектор с более чем десятилетним опытом работы с Python, я неоднократно убеждался, что знание низкоуровневых механизмов работы стеков дает конкурентное преимущество при решении сложных задач. . . .
Server-Sent Events (SSE) в Node.js
run.dev 05.06.2025
Потоковая передача данных с сервера прямо в браузер стала повседневной потребностью - от биржевых графиков и спортивных трансляций до чатов и умных дашбордов. Много лет разработчики полагались на. . .
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются: OwenLogic v. 2. 10. 366 EasyBuilder Pro. . .
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
Тестирование Pull Request в Kubernetes с GitHub Actions и GKE
Mr. Docker 02.06.2025
Мы все знаем, что тестирование на локальной машине или в изолированном CI-окружении — это не совсем то же самое, что тестирование в реальном кластере Kubernetes. Контекстно-зависимые ошибки, проблемы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »