Можно ли разбить интерфейс на 2 частичных интерфейса и реализовать его в 2 частичных классах?

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

Но сегодня я столкнулся с икотой, которую мне нужно как-то решить. Допустим, мне нужно расширить следующий интерфейс.

public partial interface ICondition
{
  void MethodA();
  void MethodB();
}

сделав интерфейс частичным и добавив файл с именем ICondition.CompanyName.cs

public partial interface ICondition
{
  void MethodC();
}

теперь я хочу реализовать интерфейс так же, как я его объявил, с MethodA() и MethodB(), реализованными в одном файле частичного класса, и MethodC() в другом.

public partial class Condition : ICondition
{
   public void MethodA(){ }
   public void MethodB(){ }
}

и мой класс Condition.CompanyName.cs

public partial class Condition : ICondition
{
   public void MethodC() { }
}

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

Редактировать

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


person Matthew Vines    schedule 19.08.2011    source источник
comment
чувство пятницы разрешено, я успел забыть, что C# имел ключевое слово ref в ответе чуть раньше... Я имею в виду, как?!?   -  person Adam Houldsworth    schedule 19.08.2011
comment
@ Адам, потому что им никто никогда не пользуется   -  person RichK    schedule 19.08.2011
comment
@RichK да, но я усугубил ситуацию, ответив на вопрос, как передать тип значения по ссылке? с вами нельзя, C# этого не поддерживает... лол!   -  person Adam Houldsworth    schedule 19.08.2011
comment
@ Адам Ого, забыть об этом - это одно, а отрицать его существование - это нечто особенное!   -  person RichK    schedule 19.08.2011


Ответы (2)


В этом случае вам не нужно иметь частичный интерфейс, вы все равно должны иметь возможность размещать методы там, где хотите.

Это, конечно, не работает, так как интерфейс должен быть реализован в одном файле.

Я не понимаю, как ваш пример не работает, я просто сделал следующее:

partial interface IFoo
{
    void One();
    void Two();
}

partial class Class1 : IFoo
{
    public void Two()
    { }

    public void Three()
    { }
}

В одном файле.

partial interface IFoo
{
    void Three();
}

partial class Class1 : IFoo
{
    public void One()
    { }
}

В другой...

person Adam Houldsworth    schedule 19.08.2011
comment
Вы можете реализовать разные интерфейсы в разных разделяемых классах, и они будут объединены в окончательный результат. - person Jonathan Dickinson; 19.08.2011
comment
Мне не «нужен» частичный интерфейс, но я хочу его, так как это значительно облегчит слияние изменений от поставщика, поскольку его файл в основном не изменится. (конечно, сохраните новое частичное объявление) - person Matthew Vines; 19.08.2011
comment
@Jonathan Я тоже не могу использовать разные интерфейсы, так как код использует объекты как ICondition. Если у меня есть 2 интерфейса, выполняющих работу одного интерфейса, как мне управлять жонглированием типов, когда я позже использую объекты? - person Matthew Vines; 19.08.2011
comment
@Мэтью. Я дополнял его ответ не относящейся к делу (но интересной) информацией. Суть в том, что и интерфейсы, и классы поддерживают частичные объявления. Вам решать, в какой части класса вы размещаете методы, но вам нужен только : ICondition для одного из них. - person Jonathan Dickinson; 19.08.2011
comment
хм, может быть, я что-то упускаю, но в моем коде в частичном классе Condition 1 есть ошибка. (). - person Matthew Vines; 19.08.2011
comment
Помните, компилятор C# фактически объединяет частичные классы в один файл (это не совсем то, что происходит, но конечный результат тот же). Они НЕ разные типы. Конечная сборка не имеет концепции частичных классов. Оба класса находятся в одном проекте и в одном пространстве имен? - person Jonathan Dickinson; 19.08.2011
comment
@ Джонатан, я изменил свой ответ, чтобы удалить это утверждение, я думал, что это правда, но я вспомнил нечто совершенно другое. Определение интерфейса требуется только на одной стороне партиала, но его размещение на обеих сторонах не вызовет ошибок. - person Adam Houldsworth; 19.08.2011
comment
@Jonathan Джонатан, я чувствую себя глупо, у меня было 2 частичных класса в разных пространствах имен из-за опечатки. Большое спасибо за ваше время, вы были на верном пути. - person Matthew Vines; 19.08.2011
comment
Я только что реализовал исходный код OP в четырех отдельных файлах, и он работал нормально. - person FishBasketGordo; 19.08.2011
comment
@ Мэтью, возможно, частичные определения находятся в разных пространствах имен? Я только что изменил одно из своих пространств имен, чтобы попробовать, и получаю описанную вами ошибку. - person Adam Houldsworth; 19.08.2011
comment
@ Адам, это именно так, см. пару предыдущих комментариев и мое редактирование исходного вопроса. Спасибо, что посмотрели на это со мной. - person Matthew Vines; 19.08.2011

Может быть, ваши частичные классы не находятся в одной сборке?

В противном случае ваш пример должен работать нормально...

person sloth    schedule 19.08.2011