2011-01-06 43 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的一個參考,但希望能夠訪問伊巴爾的元素,而無需包括引用和using語句來伊巴爾。無論如何設置IFoo,只要它被引用/包含,它也帶來IBAR一起乘坐?類似#include的方式直接運行C. 如果您說「複製並粘貼IBar到IFoo.cs」,我會忽略你。

我猜測,因爲我從來沒有看到任何可以做到這一點的東西,答案可能是你不能在C#中做到這一點。

編輯:的文件IBar.cs和IFoo.cs是在單獨的組件
編輯:的接口是公開的,不是性能

回答

0

上面的代碼應該沒有任何修改或額外的「使用」語句添加。這是因爲C#編譯器將整個項目(即所有源文件)編譯爲一個大單元,而C(和C++)編譯器則通過預處理器指令(如#include)來指示它們要包含哪些文件。

順便說一句,接口聲明中的成員是隱式公開的,所以你的'公共'修飾符至少是多餘的(我認爲它也給你一個編譯器錯誤)。也許這是什麼讓你感到困惑?

交通不便只能出現(在接口的情況下),當您不匹配的可見性修飾符,例如:

internal interface IFoo 
{ 
    void Stuff(); 
} 

public interface ISomething 
{ 
    IFoo GetFoo(); 
} 

在這種情況下,你會得到「可訪問性不一致」的編譯錯誤。

編輯如果otherwise.cs和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

對不起,我的意思是表明他們在不同的程序集以及不同的文件。 – 2011-01-06 19:48:22

1

這不是C#中的「可以做」或「不能做」的問題,它只是cookie崩潰的方式,並且沒有任何錯誤。基本上,你只要引用該程序集並將該名稱空間放入using子句中以訪問IBar

什麼特別讓你有麻煩?如果您的問題只是編輯體驗,請考慮使用類似ReSharper的工具。

0

不問你在C#中不能做什麼。您只需添加兩個使用語句。

最接近的機制,你想要什麼,我還是不希望它的工作,是一個「using別名」,它看起來像這樣:

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

一廂情願的想法,但沒有。