2013-06-02 48 views
1

我有一個有趣的場景,我一直在思考,想知道什麼解決方案可能會有一個比我提出的更優雅的解決方案。管理界面執行成員的可訪問性

考慮以下類型

public class Session : ISessionGraphTransitionHandler 
{ 
    public void Handler1() 
    { 
     // do stuff that leverages this object instance 
    } 

    public void Handler2() 
    { 
     // do stuff that leverages this object instance 
    } 
    // ... 

    public void HandlerN() 
    { 
     // do stuff that leverages this object instance 
    } 

    private Graph sessionGraph; 

    public Session() 
    { 
     sessionGraph = new Graph(this); // where ISessionGraphTransitionHandler is expected 
    } 
} 

目前的界面看起來是這樣的:

public interface ISessionGraphTransitionHandler 
{ 
    public void Handler1(); 
    public void Handler2(); 
    ... 
    public void HandlerN(); 
} 

這一切的問題是,外部參與者可撥打sessionInstance.Handler1()內部似乎是它可以解決這在某種程度上,但我正在尋找其他解決方案。這裏的想法是該圖應該調用父類。這是一種設計氣味嗎?有沒有更好的方法來解決這個問題?

實際類型未清除,併發布here。我稍後可能會清理它們。

回答

1

我不確定我的問題是否正確,所以我猜測了一下。

public interface IHandler 
{ 
    void Handle(); 
} 

public class HandlerDirector 
{ 
    IList<IHandler> Handlers = new List<IHandler>(); 

    public void AddHandler(IHandler handler) 
    { 
     Handlers.Add(handler); 
    } 

    public void RunAllHandlers() 
    { 
     foreach (IHandler handler in Handlers) 
      handler.Handle(); 
    } 
} 

現在外部的代碼將使用的AddHandler(IHandler處理器)處理,並使用RunAllHandlers運行所有的處理程序()。

+0

當然,不是一個可怕的想法,但是這些處理程序類需要訪問會話中定義的元素。 –

1

如果不知道更多關於您試圖解決的問題以及對可能的解決方案的限制,很難回答。但是,聽起來您可能需要使用子類和受保護的成員。因此,例如,您可以將Handler1()...HandlerN()從接口中除去,而是在父類中將其聲明爲受保護的,如果您想強制子類中的實現,也可能將其聲明爲抽象。

public class ParentClass 
{ 
    protected abstract void Handler1(); 
    ... 
    protected abstract void HandlerN(); 
} 

public class Session : ParentClass, ISessionGraphTransitionHandler 
{ 
    private void Handler1(); 
    ... 
    private void HandlerN(); 

} 

凡是應該是無法訪問外部參與者可以是ParentClass抽象成員。任何公開的內容都可以是ISessionGraphTransitionHandler的成員。

如果你想限制 外部參與者訪問接口中所有方法的全部,那麼這就引發了你爲什麼要使用接口的問題。

+0

這是一個公平的問題,但問題在於圖需要對某些實現處理程序的類型執行操作,該類型對圖響應。如果這只是簡單的事件,我會這樣做,但這包括邏輯謂詞。因此,該圖需要一個處理程序來爲如何響應圖轉換提供外部邏輯(該圖是一個狀態機)。一個接口比注入匿名代理更加合理。 –

+0

添加了實際來源。 –

+0

你可能正在尋找C#相當於'朋友',遺憾的是它不存在。 – SteveM

1

這裏一個合理的解決方案是利用C#中的顯式接口實現機制,只允許通過IEncounterTransitionHandler接口訪問接口元素,將接口標記爲內部接口,並假定開發人員不會在內部濫用這種類型。