2017-08-09 81 views
-1

我寫一個「系統」使用外部庫,我的代碼相結合。我想問一下,是否有可能將類的屬性暴露給應用程序的一部分並隱藏給其他人?是否有接口,抽象類,可以做到這一點的繼承的組合?如何類的財產暴露於一類,並隱藏到另一個?

爲什麼: 我使用外部庫的對象,例如在我的類屬性。我不想從類的任何實例訪問該屬性,只能從「裝飾者」類中進行訪問。我可能是錯的,這可能是OOP的違規行爲,它不可能完成,我不知道。

我已經試過如下: 讓ExternalEngine「是對象我想隱藏:

public class Engine : EngineBase, IEngine 
{ 
    public string OtherProperty {get;set;} 
} 

public abstract class EngineBase 
{ 
    protected ExternalEngine External {get;set;} 
} 

public interface IEngine 
{ 
    public string OtherProperty {get;set;} 
} 

public abstract class A : Engine 
{ 
    protected Engine engine; 
    protected A(Engine engine) 
    { 
     this.engine = engine; 
    } 
} 

public class B : A 
{ 
    public B(Engine engine) : base(engine) 
    { 

    } 

    public void SampleOperation() 
    { 
     // operation on 'engine' field 
    } 
} 

而且我在它試圖接口,抽象類和訪問修飾符的多種組合,但沒有提供什麼我需要。

在我的小例子,我想只有從B類的方法來修改類引擎的對象ExternalEngine(但通過繼承的這個組合還有的不能訪問該財產;))

請指引我解決 在這個項目中,而不是在其他項目(項目說A);感謝

+0

'ExternalEngine'是一個類型,而不是一個對象,它遠不定義 – Adrian

+0

現在引擎對象和所有其類型在Builder類中創建 –

+1

您可以使用依賴注入。在代碼中引用接口,這樣只有相應的接口才能「瞭解」該字段。儘管它們仍然可以由同一個具體類來實現。 – maccettura

回答

1

我相信你所要求的可以在類庫內部接口來實現。這裏是我的代碼將在類庫使用:

namespace ClassLibrary1 
{ 
    // Your public facing engine implementation. 
    public class Engine 
    { 
     private ExternalEngineHost ExternalHost; 

     public Engine() { } 

     internal void DoSomething() 
     { 
      ExternalHost.OtherEngine.DoSomethingExternally(); 
     } 
    } 


    internal sealed class ExternalEngineHost : IExternalEngineHost 
    { 
     public ExternalEngine OtherEngine { get; set; } 
    } 


    internal interface IExternalEngineHost 
    { 
     ExternalEngine OtherEngine { get; set; } 
    } 


    // This class should handle communication with the external library.  
    internal class ExternalEngine 
    { 
     internal void DoSomethingExternally() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

做這樣的事情,這意味着你必須有,而不必依賴於抽象或聰明費解的代碼隱藏存取您在發動機外部功能的好處。作爲一種好處,您可以阻止人們使用內部標記來實現界面,但是您可以通過類庫中的界面製作多個可以訪問ExternalEngine類的實現。下面是如何上面類庫可以在另一個組件一起使用的例子:

namespace ConsoleApplication1 
{ 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Engine e = new Engine(); 

      // Can do this. 
      e.DoSomething(); 

      // Can't do this. 
      e.ExternalHost.DoSomethingExternally(); 
     } 
    } 
} 

幸田來未

+0

你的回答是我最想做的事情。我也提出了Nkosi關於Interfaces Segregation的評論,因爲我也可以這樣做 –

0

如果你把你的B類在一個單獨的項目(說項目B),您可以添加引用ExternalEngine(使用ExternalEngine)。所有你需要做的就是添加一個參考項目B到項目A.

Using ProjectB; 

然後,您可以使用的方法,類和項目類B的屬性,但不能直接使用ExternalEngine因爲它沒有被引用。

你的代碼編譯成兩個文件。

您還需要投入:

public abstract class EngineBase 
{ 
    protected ExternalEngine External {get;set;} 
} 

到B項目,因爲這表示ExternalEngine了。

相關問題