2015-12-13 25 views
0

我想限制基類方法在我的派生類中的訪問。這可能嗎?限制在派生類中的訪問方法

class Class1 
    { 
     protected virtual void Method() 
    { 

    } 
} 

class Class2 : Class1 
{ 
    protected override void Method() 
    { 
     base.Method(); 
    } 

} 

class Class3 : Class2 
{ 
    public Class3() 
    { 
     //I want to restrict to use this method in this class alone 
     this.Method(); 
    } 

} 

但它必須從基類派生。

+0

您正在尋找的解決方案將允許調用base.Method();或不 ? – Daneau

+0

你能描述你爲什麼希望做這個限制嗎?可能有更好的方法來做你想做的事。 –

回答

1

沒有在C#的方式本身做到這一點。

如果您的方法私有的,那麼沒有子類可以訪問它。這聽起來不像你想要的。如果它像現在一樣受到保護,即使將它隱藏在class2中,class3仍然可以訪問class1的Method()。

本質上講,有需要爲基類知道是否允許或限制訪問的方式。

一種方法可能是使用接口;讓子類實現一個IAccessRestricted空接口,並且可以使基類方法成爲通用的。當T實現IAccessRestricted時,基類方法返回。

與此或任何類似的問題是的訪問控制還沒有真正的基類。在課堂上需要限制。所以這是毫無意義的。因此,如果需求是某些子類可以訪問,而有些則不能,那麼我會讓基類不具有該方法,然後添加一個臨時基類,然後添加一個臨時基類,然後添加一個臨時基類,然後添加一個臨時基類,將不能訪問Method()。

class BaseWithOutMethod 
    { 

    } 

    class BaseWithMethod : BaseWithOutMethod 
    { 
     protected virtual void Method() 
     { 
      // do method stuff 
     } 
    } 

    class Class2 : BaseWithMethod 
    { 
     protected override void Method() 
     { 
      base.Method(); 
     } 
    } 

    class Class3 : BaseWithOutMethod 
    { 
     public Class3() 
     { 
      // cannot access Method because it is not in this base class 
     } 
    } 
+0

在此解決方案上,您不再在class2和class3之間繼承。但背後的想法很好。 – Daneau

+0

確實非常好。這絕對是一個設計問題,如果它要有效,就需要做出一些妥協。在那裏可能有一個反射解決方案,但它仍然沒有真正限制訪問。選擇性訪問受保護的成員不僅僅是C#的功能:) –

+0

「選擇性訪問受保護的成員不僅僅是C#所做的事情」,你的意思是我提出的「黑客」? – Daneau

0

案例1:base.Method();是一個有效的呼叫。

您可以覆蓋CLASS3的方法,並拋出一個異常

案例2:你想阻止3級至不惜一切代價使用此方法。

您目前正面臨設計問題。那麼解決方案就是個案問題。請記住,一個子類可以被認爲是父類。 在當前場景中,class1的Method實現爲空。聲明它是抽象的。在Class2中保持抽象,但實現所有你想要的,然後class3將能夠「實現」它,根本沒有代碼。一個Class4將存在以填充Class2中缺少的代碼塊。

的其他「黑客」可以做。我想讓你知道這是一個HACK並反映了一些設計缺陷。在class1中添加一個受保護的布爾值。在Class1實現Method的一開始,您檢查bool的值並運行代碼或拋出異常。然後,您可以在class3中將布爾值設置爲false,並確保它無法從父類運行代碼。

的其他工作以防萬一那就是「強」將添加到customAttribute CLASS3這將是那裏表明您不能調用fonction。此時在父方法中獲取當前實例的類型並通過反射驗證指定的屬性是否不存在。通過這樣工作,您可以「阻止」任何人將布爾值從我之前的破解設置爲true,然後調用並將其設置爲false。任何希望繞過這個過程的程序員都會被迫去除班級中的「限制」。

7

這是在我的採訪中和我的朋友在其他一些採訪中提到的。但他們告訴我們可以限制這一點。

你問的是,正如其他答案所指出的,在C#中是不可能的。所以,一些假設:

  • 採訪者錯誤地認爲這是可能的。
  • 面試官知道這是不可能的,並希望看到你是否知道這一點。
  • 面試官問這個問題做得不好,他們試圖提出的問題與您在此提出的問題不同。
  • 面試官知道這是不可能的,但想看看你是否可以提出探索性問題 - 比如「你爲什麼要這麼做?」 - 以查看您是否是專注於技術問題的人,或者您是否真的試圖找出編寫軟件的用戶驅動理由。

被我問的問題也提出了我會推回來「那麼,你告訴我是你設計一個類層次結構與一個方法使破碎只有特定的類可以使用它正確的,而且必須由那些類使用的,對不對?不要設計這樣的方法。這個問題不應該是如何阻止我使用此設計不好的方法同事和客戶。這個問題應該是如何修復該方法,以便對每個人都有用。「