История изменений
Исправление
MOPKOBKA,
(текущая версия)
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print? Для динамики синтаксис другой если что, там пишется вот так fn dynf(obj: &dyn Trait).
Если не хочешь виртуализации то нельзя скрывать реализацию, и функции которые работают с трейтами. Это так что в Rust, что в С++.
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. Это девиртуализация невозможна без LTO.
Тебе надо поскорей принять идею что трейты = абстрактные классы, тогда станут понятны их свойства и ограничения.
Исправление
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print? Для динамики синтаксис другой если что, там пишется вот так fn dynf(obj: &dyn Trait).
Если не хочешь виртуализации то нельзя скрывать реализацию, и функции которые работают с трейтами.
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. Это девиртуализация невозможна без LTO.
Тебе надо поскорей принять идею что трейты = абстрактные классы, тогда станут понятны их свойства и ограничения.
Исправление
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print? Для динамики синтаксис другой если что, там пишется вот так fn dynf(obj: &dyn Trait).
Если не хочешь виртуализации то нельзя скрывать реализацию, и методы которые работают с трейтами.
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. Это девиртуализация невозможна без LTO.
Тебе надо поскорей принять идею что трейты = абстрактные классы, тогда станут понятны их свойства и ограничения.
Исправление
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print? Для динамики синтаксис другой если что, там пишется вот так fn dynf(obj: &dyn Trait).
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. Это девиртуализация невозможна без LTO.
Тебе надо поскорей принять идею что трейты = абстрактные классы, тогда станут понятны их свойства и ограничения.
Исправление
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print? Для динамики синтаксис другой если что, там пишется вот так fn dynf(obj: &dyn Trait).
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. Это девиртуализация невозможна без LTO.
Исправление
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print? Для динамики синтаксис другой если что, там пишется вот так fn dynf(obj: &dyn Trait).
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. А девиртуализация невозможна без LTO.
Исправление
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print? Для динамики синтаксис другой.
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. А девиртуализация невозможна без LTO.
Исправление
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print?
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. А девиртуализация невозможна без LTO.
Исправление
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print?
сама концепция это не отрицает.
Абстрактные классы вполне отдельно можно реализовать. А девиртуализация невозможна.
Исходная версия
MOPKOBKA,
:
это честно по отношению к си++. или тебе придется писать header-only код и покрыть себя позором.
А как там хедеры в Rust поживают?
а в расте нельзя обьявить что реализуешь трейт, а саму реализацию спрятать?
С другой стороны надо заходить, вот есть у тебя функция fn f<T: Trait>(obj: T), как она будет использовать твой Trait? Откуда она знает что нужно вызвать int::print?