2013-01-31 41 views
1

我使用自定義角色提供者,我做了一個CustomRoleProvider類,並在它實施了一些RoleProvider方法,這樣什麼是不一致的可訪問性錯誤?

public class CustomRoleProvider: RoleProvider 
{ 
public override void CreateRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
    { 
     throw new NotImplementedException(); 
    } 
    } 

所有的方法都是public.but它顯示錯誤

錯誤4 - 不一致的可訪問性:基類 'RoleProviderExample.RoleProvider'不如 'RoleProviderExample.CustomRoleProvider'類可訪問。

我在哪裏做錯了?

+0

你的基類是不公開的 – Jodrell

回答

4

您正在通過CustomeRoleProvider公開的基類RoleProvider不是public

如果您聲明RoleProviderpublic,錯誤將消失。您不必給RoleProvider構造函數一個public


另外,您可以的CustomRoleProvider的無障礙環境降低到的RoleProvider。這可能是最合適的答案,你需要在組件外面暴露CustomRoleProvider嗎?


如果RoleProvider是一個接口,那麼,按照慣例,它被錯誤命名,你可以重命名爲IRoleProvider。無論如何,它仍然不太容易接受,然後CustomRoleProvider

設爲公開這樣,

public interface IRoleProvider 
{ 
    void CreateRole(string roleName); 

    bool DeleteRole(string roleName, bool throwOnPopulatedRole); 
} 

如果沒有指定的interfaceclassstruct的無障礙環境,internal是隱含的。

interface成員總是public。除非另有說明,否則classstruct成員爲private

除了總是public的接口成員的情況外,指定是好的做法。

您的實現可能如下所示,override關鍵字不應用於接口實現,除非它們重寫了可覆蓋的基類實現。

public class CustomRoleProvider : IRoleProvider 
{ 
    public void CreateRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
    { 
     throw new NotImplementedException(); 
    } 
} 
如果你想明確地實現接口

public class CustomRoleProvider : IRoleProvider 
{ 
    public void IRoleProvider.CreateRole(string roleName) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool IRoleProvider.DeleteRole(
     string roleName, 
     bool throwOnPopulatedRole) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

但是RoleProvider是一個接口,CustomRoleProvider是一個已經公開的類。我如何使RoleProvider接口公開? – Mogli

+1

@Anand界面成員自動** public **。 –

+0

@Anand,我已經用我所能提供的所有重要細節擴展了我的答案。我希望這有助於清理您的理解並提高代碼的一般可讀性。 – Jodrell

0

這意味着你已經定義了RoleProvider ......但是成爲一個私人類(這是真的嗎?)。嘗試使RoleProvider成爲public

+1

'protected'仍比'public' – Jodrell

+0

我的壞少入店。從錯誤中學習。 – Jason

5

你應該讓你的RoleProviderpublic也。

public class RoleProvider 
{ 
    ... 
} 

基類不能比派生類更容易訪問。你的RoleProvider類可能有access modifiersCustomRoleProvider類更少。

public class CustomRoleProvider : RoleProvider 
    { 
     public void CreateRole(string roleName) 
     { 
      throw new NotImplementedException(); 
     } 

     public bool DeleteRole(string roleName, bool throwOnPopulatedRole) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    interface RoleProvider 
    { 
      void CreateRole(string roleName); 

      bool DeleteRole(string roleName, bool throwOnPopulatedRole); 
    } 

實際上,您不必在接口上編寫public關鍵字。界面成員自動爲public。它們不能包含任何訪問修飾符。

+0

但RoleProvider是一個接口,CustomRoleProvider是一個已經公開的類。我如何使RoleProvider接口公開? – Mogli

+0

@Anand看看我更新的答案。 –

+0

@Anand,如果'RoleProvider'是一個接口,那麼'override'關鍵字是虛假的,誤導性的,就像'RoleProvider'的命名一樣。 – Jodrell

0

嘗試將RoleProvider類的訪問說明符更改爲public或internal。