2011-01-06 2 views
1

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

//IBar.cs 
namespace bar 
{ 
    interface IBar 
    { 
     public int BarProp { get; set; } 
    } 
} 

//IFoo.cs 
namespace foo 
{ 
    using bar 
    interface IFoo 
    { 
     public IBar FooProp { get; set; } 
    } 
} 

//elsewhere.cs 
namespace foo 
{ 
    //using bar //without this, 
    IFoo myFoo = new SomeClassThatImplementsIFoo(); 
    myFoo.FooProp.BarProp //<-- BarProp is inaccessable here 
} 

В elsewhere.cs, у меня есть ссылка на IFoo, но хотелось бы иметь возможность доступа к элементам IBar без необходимости включать ссылки и используя заявление IBar. Есть ли все равно, чтобы настроить IFoo так, чтобы всякий раз, когда он ссылался/включался, он также приносил IBar для поездки? Что-то вроде способа #include s работает в прямой C. Если вы скажете «Скопируйте и вставьте IBar в IFoo.cs», я проигнорирую вас.

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

EDIT: Файлы IBar.cs и IFoo.cs находятся в отдельных сборках
EDIT: интерфейсы являются открытыми, а не свойства

ответ

0

Ваш вышеуказанный код должен работать без каких-либо изменений или добавляться дополнительные «используемые» заявления. Это связано с тем, что компилятор C# компилирует весь проект (т. Е. Все исходные файлы) как один большой блок, тогда как компиляторы C (и C++) инструктируются директивами препроцессора (например, #include), чтобы сообщить им, какие файлы включать.

Кстати, члены в декларациях интерфейса неявно публичны, поэтому ваши «общедоступные» модификаторы по крайней мере избыточны (я думаю, что это также дает вам ошибку компилятора). Возможно, это вас путает?

Недоступность может произойти только (в случае интерфейсов), когда вы не подходите модификаторы видимости, например:

internal interface IFoo 
{ 
    void Stuff(); 
} 

public interface ISomething 
{ 
    IFoo GetFoo(); 
} 

В этом случае вы получите ошибку компиляции из «несовместимыми доступности».

Редактировать: Если в других местах, а также в IBar.cs находятся в разных сборках, сборка в другом месте.cs должна содержать ссылку на сборку, содержащую IBar (и IFoo). Невозможно автоматизировать это, хотя Visual Studio предупредит вас, если вы потеряете какие-либо ссылки (и ваш проект не будет компилироваться).

1
namespace bar 
{ 
    interface IBar 
    { 
     public int BarProp { get; set; } 
    } 
} 

//IFoo.cs 
namespace foo 
{ 
    using bar; 
    interface IFoo 
    { 
     public IBar FooProp { get; set; } 
    } 
} 

//elsewhere.cs 
namespace foo 
{ 

    class test: IFoo { 

     public test(){ 
    //using bar //without this, 
    IFoo myFoo = new test(); 
    int val = myFoo.FooProp.BarProp; //<-- **BarProp is not inaccessable here** 
     } 
    } 
} 

Типы доступны с использованием имен файлов не.

+0

К сожалению, я хотел указать, что они были в разных сборках, а также в разных файлах. –

1

Это не вопрос «может сделать» или «не может сделать» на C#, это просто то, как cookie рушится, и в этом нет ничего плохого. В принципе, вы просто имеете, чтобы ссылаться на эту сборку и помещать это пространство имен в статьи using для доступа к IBar.

Что, в частности, вызывает у вас какие-либо проблемы? Если ваша проблема - это просто опыт редактирования, подумайте об использовании инструмента, например ReSharper.

0

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

Ближайший механизм к тому, что вы хотите, и я до сих пор не ожидаем, что он работает, является «используя псевдоним», который выглядит следующим образом:

using BarProp = bar.IBar.BarProp; //nice try, but not legal 

Желаемое, но нет.

Смежные вопросы