Часткові класи в окремих зал


154

Чи можливо мати дві частини (однаковий простір імен, те саме ім’я класу) до часткового класу в окремих DLL-файлах?


як і інші сказали, що це неможливо, але є способи доповнити класи новою поведінкою з різних джерел, що саме ви хочете робити в різних місцях?
Озан

У моєму випадку я хочу додати пару статичних методів до класу, визначеного в сторонній бібліотеці. Методи розширення не працюватимуть, і інтерфейси та успадкування не будуть працювати, оскільки клас статичний. Після того як я виявив, що у вас можуть бути часткові статичні класи, я прийшов сюди, щоб дізнатися, чи працює він на складах, але, на жаль, схоже, що це теж не буде працювати.
Бен

Відповіді:



36

Ні. Часткові класи - суто мовна особливість. Коли складено збірку, файли поєднуються для створення типу. Неможливо розповсюдити файли на різні збірки.

Однак, залежно від того, що ви хочете зробити, ви можете використовувати методи розширення, щоб досягти того, що вам потрібно.



8

Хоча інші відповіді дають неприємне "Ні", що хто-небудь, що висаджується на цю сторінку, не хотів бачити і не чути, мене вразила інша думка, яка тут ще не згадується. Якщо дозволити часткові класи через асамблеї, можна отримати доступ до приватних членів існуючих типів, які не були написані ним, тим самим дозволяючи йому маніпулювати ними способами, які не були призначені оригінальним автором, тим самим загрожуючи функціональності всіх класів успадковування теж.

Мало того, що ці заняття в інших зборах (та їхні діти) потрібно було б перекомпілювати для того, щоб це працювало. Таким чином, логічно неможливо дозволити розділити клас на різні збірки.


Можна легко повозитися з приватними членами через роздуми, якщо це справді потрібно. Неможливо розділити клас між збірками, оскільки кругові посилання заборонені, і вони знадобляться для взаємодії різних частин класу.
Зар

6

Ви можете використовувати методи розширення, коли ви хочете додати метод до класу в іншому dll. Єдиним недоліком цього методу є те, що ви не можете додати статичні методи.


3

Питання в тому, чому ви хочете зробити частковий клас в іншій збірці? Ви можете визначати абстрактні класи та інтерфейси на різних складах, можливо, вам потрібно це вивчити.


10
IMHO є дійсні випадки, наприклад: Ви можете додати анотації форми MVC до класу моделі, визначеного в іншій збірці. Сама збірка не знає, в якому контексті вона використовується, тому клас у складі не повинен мати анотацій. Вони можуть бути додані в частковому класі в контексті MVC (якщо це можливо).
nyi

3
nyi, чому б не просто успадкувати цей клас і не оголосити свої атрибути зверху? Ви можете навіть назвати його однойменним, якщо хочете.
Глено

0

Напевно, ви просто хочете створити клас Wrapper у власній бібліотеці, навколо класу в бібліотеці 3-ї частини. Потім додайте будь-яку функціональність до класу обгортки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.