vala
English
English
  • Учебник Vala
  • Основы
    • Элементы языка
      • Типы данных
      • Управляющие конструкции
      • Методы
      • Делегаты
      • Лямбды / Замыкания
      • Пространства имён
      • Структуры
      • Классы
    • ООП
      • Основы
      • Конструктор
      • Деструктор
      • Сигналы
      • Свойства(Properties)
      • Наследование
      • Абстрактные классы
      • Интерфейсы / Миксины
      • Полиморфизм
      • Сокрытие методов
      • Информация о типах времени выполнения(Run-Time Type Information)
      • Динамическое приведение типов(Dynamic Type Casting)
      • Универсальные шаблоны(Generics)
      • Создание объектов в стиле GObject
      • Интеграция с D-Bus
      • Профили(Другие бэкенды помимо GLib)
  • Продвинутые возможности
    • Ассерты и контрактное программирование
    • Обработка ошибок
    • Управление параметрами
    • Методы с поддержкой синтаксиса
    • Многопоточность
    • Главный цикл(The Main Loop)
    • Асинхронные методы(Coroutine)
    • Слабые ссылки(Weak References)
    • Список аргументов переменной длины
    • Указатели
    • Классы не наследующие Object
    • Коллекции
      • Введение
      • HashSet<G>
      • ArrayList<G>
      • HashMap<K,V>
      • Lock-free структуры
  • Экспериментальные фичи
    • Введение
    • Строгий не null режим(Rust mode)
    • Литералы регулярных выражений(regexp)
    • Цепочки связанных выражений
  • Использование и создание библиотек
    • Введение
    • Инструменты
    • Генерирование VAPI файла из предыдущего с помощью vapigen.
    • Использование библиотек
    • Создание библиотеки
    • Vala and C
    • Meson
      • Config file
      • Static Library
      • Shared Library
      • Target GLib Version
  • Технические приёмы
    • Unit тестирование
    • Отладка
    • Использование GLib
  • Продвинуты гайд(WIP)
  • Functional Programming
    • Gpseq
    • Compose
  • Examples
    • Basic
    • GTK
      • Базовые GTK программы
      • Flappy Bird(WIP)
      • DnD
    • Websocket
  • Apps
    • Games
  • Meson-Book
    • MesonBook
    • Wrap
    • Crosscompile
    • Object files
    • Library
    • Executable
    • Code Generation
    • Installing
    • Unit Tests
    • Meson 0.54
    • Meson 0.53
  • golang-book
    • Ваша первая программа
    • Типы
    • UPDATE.MD
Powered by GitBook
On this page

Was this helpful?

  1. Основы
  2. ООП

Универсальные шаблоны(Generics)

Vala поддерживает систему обобщений времени выполнения, с помощью которой определенный экземпляр класса может быть ограничен определенным типом или набором типов, заданных во время его создания. Это ограничение обычно используется, например, для хранения в списке объектов только определенного типа, т.к. Vala будет следить за тем, чтобы объекты именно указанного типа были занесены в список и при изъятии, они будут приводится к указанному типу.

В Vala обобщения обрабатываются во время выполнения. Когда вы определяете класс, который ограничен по определенному типу, то будет существовать только один класс, и много экземпляров от него. Это отличается от C++, где на каждое ограничение по типу создается новый класс - подход в Vala более близок к Java. Наиболее важное следствие этого в том, что статические члены везде используются одинаково, независимо от ограничений, устанавливаемых в каждом экземпляре, и что определенное в потомке обобщение может быть использовано как обобщение, созданное в базовом классе.

Следующий код демонстрирует, как использовать обобщенную систему для написания минимального класса-обвертки:

public class Wrapper<G> : GLib.Object {
    private G data;

    public void set_data(G data) {
        this.data = data;
    }

    public G get_data() {
        return this.data;
    }
}

Класс Wrapper при создании должен ограничиваться типом, в данном случае тип обозначается как G, поэтому экземпляры этого класса будут хранить один объект типа G, и иметь методы для получения и изменения этого объекта (Цель этого примера показать, что обобщенный класс не может использовать свойства для своего ограничивающего типа, поэтому здесь использованы простые методы get и set.)

При создании объекта данного типа нужно выбрать тип, например встроенный тип string (в Vala не существует ограничений на тип используемого обобщения):

var wrapper = new Wrapper<string>();
wrapper.set_data("test");
var data = wrapper.get_data();

Как видите, при извлечении данных они присваиваются идентификатору без явного типа. Это возможно благодаря тому, что Vala знает, какого типа объекты находятся внутри экземпляра класса Wrapper.

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

class TestClass : GLib.Object {
}

void accept_object_wrapper(Wrapper<Glib.Object> w) {
}

...
var test_wrapper = new Wrapper<TestClass>();
accept_object_wrapper(test_wrapper);
...

Так как все экземпляры TestClass являются так же экземплярами Object метод accept_object_wrapper с радостью обработает переданный ему объект, и будет обращаться с ним как с экземпляром GLib.Object.

PreviousДинамическое приведение типов(Dynamic Type Casting)NextСоздание объектов в стиле GObject

Last updated 6 years ago

Was this helpful?