den2k88 Ответов: 4

Разделение определения и реализации


Всем привет,
много лет назад я использовал C# под VS2008, и я помню, что не было способа разделить определения классов и их реализации в разных файлах (аналогично тому, что мы привыкли делать в C и C++ с заголовочными и исходными файлами).

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

Спасибо

Что я уже пробовал:

Я бил далеко и широко, но результаты - это то, что мы все ожидаем от шутки поисковой системы. Google и остальная часть интернета не имеют доступа из интернета. рейх сеть компании.

4 Ответов

Рейтинг:
34

#realJSOP

Я думаю, вы имеете в виду" частичные " классы.

Вы можете распределить код между несколькими файлами и при этом оставаться в одном классе.


den2k88

Да, я знал их, но они все еще держатся вместе декларации и реализации. ИМХО, я бы в конечном итоге возненавидел их, потому что вместо того, чтобы иметь большую книгу и индекс (C и c++ way) В итоге у меня было бы несколько буклетов и вообще никакого индекса (частичные классы).

Рейтинг:
27

Wendelius

Насколько я знаю, не совсем так, как в C, но вы могли бы достичь такого же поведения с абстрактными классами и методами. Однако вам нужно будет сказать производному классу, от какого базового класса он унаследован, чтобы он не был таким уж свободным.

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

В зависимости от того, что вам нужно, возможно, MEF может быть тем, что вам нужно? Взгляните на Управляемая платформа расширяемости (MEF)[^]


den2k88

Это не MEF, что мне нужно (хотя я добавлю его в закладки для будущих нужд, спасибо), все рассуждения находятся под OG solution. Мне просто нравится разделять, чего ожидать от того, как он реализован, это способ иметь лучше документированный код (то есть я объясняю, что делает класс и логику его работы в заголовке, а затем кровавые детали и предложения по лучшему коду в реализации. Меньше беспорядка).

Wendelius

Да, я вижу, что использование абстрактных классов создало бы своего рода индекс, но я думаю, что это излишество из-за стоимости наследования (что в некоторой степени относится и к интерфейсам)...

Я все еще задаюсь вопросом, хороши ли частичные классы, так как вы не можете определить одну и ту же вещь дважды (в разных файлах). Компилятор просто объединяет файлы, а затем компилирует. Если у вас, например, есть одно и то же свойство, определенное в обоих файлах, вы получите ошибку.

Во всяком случае, если вам интересно, взгляните на Несколько частичных определений для класса[^]

Рейтинг:
19

OriginalGriff

Ну, вы можете использовать частичные классы, которые позволяют разделить класс между файлами - дизайнер Visual Studio использует это, чтобы отделить дизайн-код от вашего кода.
Но... C# на самом деле не имеет определения, которое в значительной степени отделено от реализации, не так, как C требовал, чтобы все функции были объявлены в прототипе до их использования, и в C# нет понятия "глобальные переменные", поэтому (за исключением интерфейсов и абстрактных классов) на самом деле нет ничего, что можно было бы поместить в "файл определения".
Вы могли бы поместить элементы const и readonly в отдельный файл, но TBH вам, вероятно, лучше использовать регионы, чтобы "свернуть" такие элементы и разделить их таким образом.

Или я совершенно далек от того, что вы пытаетесь сделать?


den2k88

Обычно я использую заголовочный файл для описания того, чего ожидать от класса, индекса, который я и мои коллеги просматриваем и мгновенно узнаем, что этот класс имеет эти методы, раскрывает эти свойства и определяет эти типы данных. Если это производный класс, то он добавляет эти методы и переопределяет эти другие. Затем в файле реализации появляются кровавые подробности о том, какие регионы полезны, и так далее.

Частичные классы полезны, но все же блоки, состоящие как из определения, так и из реализации - был только один экземпляр, в котором я хотел бы их использовать в C++, хотя разделение реализации может привести к большему беспорядку, чем раньше.

Я предполагаю, что мне придется использовать интерфейсы для тех нужд, которые у меня есть, но поправьте меня, если я ошибаюсь, интерфейсы не могут объявлять вложенные типы и члены данных, не так ли?

OriginalGriff

Нет, C# не позволяет вам объявлять что - либо конкретное внутри интерфейса - это просто контракт, в конце концов, - и нет никакого механизма, чтобы "заставить" вас реализовать вложенный класс (который должен был бы быть вложенным интерфейсом, я думаю), так что это чревато неприятностями во время выполнения! :смеяться:

Рейтинг:
11

Richard MacCutchan

Я всегда считал это полностью ООНразумный. Зачем кому-то понадобилось иметь определение классов и методов в отдельных файлах, чтобы любое изменение в одном из них должно было быть внесено и в другом? По крайней мере, авторы Java и C# поняли, насколько это нелепо, и создали компиляторы, которым нужно только одно определение.


den2k88

В большинстве случаев определение не нуждается в каких-либо изменениях. Разделив их, довольно легко проверить, имеют ли разные версии одного и того же программного обеспечения один и тот же интерфейс к классу (единое программное обеспечение с сотнями ветвей, адаптированных для клиентов, каждая ветвь, возможно, исходит из разных версий базового программного обеспечения).

Одно дело-интерфейс, другое-код. В то время как интерфейсы решают проблему, они на самом деле являются инструментом, предназначенным для других целей (точно определяющим, что класс должен сделать, чтобы выполнить свою часть "контракта"), вместо того чтобы дать краткое резюме того, какую операцию выполняет класс, какие операции доступны из внешнего мира и какие данные он хранит.

Richard MacCutchan

Да, но вы говорили не об интерфейсах, а это совершенно другая проблема.