Re[3]: Чем заменить виртуальные функции?
От: Sm0ke Россия ksi
Дата: 10.08.23 18:33
Оценка:
Здравствуйте, zelenprog, Вы писали:


S>>Если это скриптовый язык с динамической типизацией, который позволяет в массив складывать объекты разных типов


Z>Да, в массив можно сложить объекты любых типов.


Этот язык позволяет пройтись по такому массиву и вызвать для каждого элемента одноимённые методы?

Z>У меня задача — из метода базового класса сделать вызов другого метода, который может быть переопределен у потомка.


Z>Я прочитал в интернете, что чисто с архитектурной точки зрения, наследование — это не очень хорошо, так как наследование является сильным связыванием.

Z>Мой скриптовый язык позволяет наследовать классы.
Z>Но как заменить обычные виртуальные функции, другими архитектурными решениями?

Есть такая идиома pimpl
Вы можете сделать внешний класс (обёртка), который хранит в своём свойстве экземпляр другого класса (реализация).
Делаете разные классы реализаций, которые друг с другом не связаны. Но чтобы они все имели схожие наборы методов.

Из метода обёртки можно будет вызывать методы реализаций.

class base_1
{
  connect() {}
  close() {}
}

class base_2
{
  connect() {}
  close() {}
}

class wrap
{
  var impl

  do_something()
  {
    impl.connect()
    impl.close()
  }
}

var items = array( new wrap(new base_1), new wrap(new base_2) )
items each it { it.do_something() }


По сути это обычная инкапсуляция. Зато не требует наследования.
Но если у вас уже чётко прописана иерархия классов, на которую вы повлиять не можете — то думаю это вам не поможет)

Кстати если из метода класса реализации нужен метод внешней обёртки, то можно попробовать передать обёртку (this) в метод реализации в качестве параметра.
Отредактировано 10.08.2023 18:41 Sm0ke . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.