Здравствуйте, Codealot, Вы писали:
S>> Реализация будет в разных файлах, а объявление partial в основном.
C>И что тебе мешает сделать так же с базовым классом?
Зачем мне 2 класса вместо одного? Зачем плодить сущности?
Проблема виртуальности в том, что тяжело читать код.
То есть видишь метод, но реально переопределяет этот метод 10 классов.
И ничем не лучше partial классов.
Чем abstract или интерфейс лучше partial?
Только тем, что тебе почему то не нравится partial? Мне очень нравится и не только мне.
Мне partial нужен только для быстрого понимания кода в небольших классах.
Там где классы большие partial methods и не нужен.
Вернее может он и нужен где то для T4, но для SG не нужен.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Codealot, Вы писали:
S>> Зачем мне 2 класса вместо одного? Зачем плодить сущности?
C>Классы экономить. Пц.
Зачем на пустом месте плодить классы?
то есть вместо partial method нужно еще создавать класс наследник с реализацией метода.
Ты батенька мазохист.
Еще раз partial method только для удобства чтения класса. Всё!
Могу и не писать или удалить без последствий.
SG и так сгенерит реализацию метода.
А вот с классом наследником так не получится!
S>>То есть видишь метод, но реально переопределяет этот метод 10 классов. C>Синтаксически, ничем не должно отличаться.
Синтаксически да, а реализация разная S>>И ничем не лучше partial классов. S>> Чем abstract или интерфейс лучше partial?
C>Тем, что решают ту же задачу и не нужно загромождать язык.
Вот именно, что абстракт и загромождают.
А partial расширяют. Но как видно тебе это не понять.
Например реально для C# важнее быстрое написание SG через макросы.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Codealot, Вы писали:
S>> Зачем на пустом месте плодить классы?
C>Реально пц. Классы не тот ресурс, который нужно экономить.
Экономить не надо, а вот читать сложнее.
Кроме того методы могут быть приватными или вообще методами класса внутри класса.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Codealot, Вы писали:
P>>Малеха пропустили, и ваш метод повис в воздухе.
C>Непонятно, что ты хотел сказать.
Вы предлагаете подробить класс на цепочку наследования, которую надо теперь мейнтейнить руками. Три файла — три класса. Ошибаетесь в имени, наследуете 3й от 1го и приплыли.
В случае с partial вы доопределяете метод ровно там, где это нужно. Эдакий плагин.
Теперь интереснее — покажите, как вы собираетесь ваш генеренный код инстанцировать из другого генеренного кода
Подробно — как генератор узнает, что через год вы допишете наследование и нужно будет инстанцировать тот а не этот.
В нашем случае все просто — new XxxComponent()
Или делаем метод-фабрику, который тоже partial.
В вашем случае надо городить огород — пилить целый слой поверх, все перенаследовать.
Здравствуйте, Codealot, Вы писали:
C>Какая-то очень мутная фича. Решение крайне узкой задачи, которую можно решить другими методами. C>Или я то-то упускаю?
очень удобная фича когда делаешь свой кодогенератор, когда есть автогенеренный класс и нужно немного расширить его функциональность, не создавая при этом виртуальных методов.
partial class, partial метод очень подходят для этого.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, okon, Вы писали:
O>>не создавая при этом виртуальных методов.
C>Зачем, собственно?
А зачем их собственно создавать, если можно без них? Посмотри например на реализации StronglyTypedId на sg, и расскажи как их реализовать при помощи виртуальных методов и что будет в этом случае с производительностью. Ну или посмотри на nswag openapi2csclient, который генерит http-клиента, готового к использованию, а если его надо расширить, то достаточно реализовать несколько partial методов без наследования и изменения имени класса.
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, amironov79, Вы писали:
A>>А зачем их собственно создавать, если можно без них?
C>А зачем собственно создавать частичные методы, если можно без них?
Если тебя не удовлетворяют ответы из этой ветки, тогда лучше задать этот вопрос на гитхабе C#, там архитекторы языка обитают, они точно в курсе истинных причин
Здравствуйте, Codealot, Вы писали:
A>>А зачем их собственно создавать, если можно без них?
C>А зачем собственно создавать частичные методы, если можно без них?
Codealot не читатель. В свое время T4 и SG работали только в компайл тайме.
Поэтому и нужны были partial methods. Сейчас SG работает design-time поэтому partial methods не особо то и нужны.
Да для быстроты нужно кэшировать проверять изменения.
Можно для себя для удобочитаемости в маленьких классах добавлять partial methods.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, amironov79, Вы писали:
A>Если тебя не удовлетворяют ответы из этой ветки, тогда лучше задать этот вопрос на гитхабе C#, там архитекторы языка обитают, они точно в курсе истинных причин
Здравствуйте, Codealot, Вы писали:
C>Никто так и не смог внятно объяснить, почему нельзя было использовать просто виртуальные методы. Ну, кроме "не хочу их использовать вот и всё".
У меня до генераторов руки пока так и не дошли, так что возможно напишу глупость.
В моём понимании смысл в том, что пишешь:
class MyModel
{
public int Property {get; set;}
[ToGenerate]
public partial int ProcessingToInt(string arg);
[ToGenerate]
public partial float ProcessingToFloat(string arg);
}
генератор по понятному ему атрибуту найдёт этот не реализованный метод, получит прототип (название, входные параметры, возвращаемый тип данных, область видимости) и реализует нужное тело метода.
В итоге дальше спокойно создаёшь объекты классы MyModel и работаешь с ними, вызываешь сгенерированные методы как самописные.
Если partial заменить на abstract, то получится, что генератору нужно будет создать целый новый класс-наследник, где будет реализован этот метод.
А значит нужно потом создавать везде объекты не MyModel, а сгенерированного наследника MyModelGenerated, чтобы дёргать этот виртуальный метод, что не есть удобно.
Если менять на virtual, то не понятно как это должно работать. Ну, разве что можно пустую реализацию самому писать с throw new NotImplementedException(), а генератор отработает как для abstract с созданием наследника и теми же сопутствующими неудобствами.
Если я ошибаюсь и генераторы так не умеют, то непонятно зачем они такие нужны