[英]C# internal getter, protected setter with an internal class parameter
我有一個問題,想要一個屬性有一個內部getter和一個受保護的setter,如本問題所述 ,我想我通過執行以下操作解決了這個問題 :
public class Accessor : AccessorBase
{
private Connection _connection;
protected void setConnection(Connection value)
{
_connection = value;
}
internal Connection GetConnection()
{
return _connection;
}
...
}
但是,我現在收到此錯誤:
可訪問性不一致:參數類型“連接”比方法“setConnection(連接)”更難訪問
這是因為我有internal class Connection
。 我寧願不讓Connection
成為公共類,而Accessor
需要公開,那么如何在保持內部getter和受保護的setter的同時解決這個錯誤呢?
遺憾的是,C#不支持“內部
和受保護”訪問修飾符(僅支持“內部
或受保護”),這意味着任何
protected
成員在程序集外部都可見,並且不能使用內部類型。
使用
internal
而不是
protected
將是最合理的解決方案。
您可以
在Microsoft Connect上投票,以便有一天可能會將其添加到C#中。
更新:從C#7.2起,您可以使用private protected
。
創建內部Connection
對象實現的公共接口IConnection
。 讓GetConnection
和SetConnection
方法接受並返回IConnection
而不是Connection
。
基本的SOLID原則再次獲勝。
如果Connection類是內部的,則派生Accessor的類將無法調用受保護的setConnection,因為它無權訪問Connection。
如果要保護setConnection,則Connection必須是公共的。
抱歉,如果您需要精確設置,則需要公開Connection
類。
不可思議的是,你做不到這一點。 由於Connection
是內部的,從另一個程序集從Accessor派生的某個類將無法看到Connection
,即使您將setter標記為protected internal
也不會解決任何問題。
您唯一的希望是將類Connection公之於眾。
Coincoin是正確的 , Accessor
是一個公共類,任何人都可以從中獲得,這也意味着來自不同的程序集。 該派生類現在具有需要傳遞內部(來自另一個程序集)類的受保護方法。 這永遠不會奏效。
您需要將Accessor
內部或Connection
公開,或者更好地遵循Randolphos的答案
這是問題的代碼示例
大會1
//this class is only visible in Assembly 1
internal class Connection
{
}
public class Accessor
{
protected void SetConnection(Connection con) { }
}
第2組 - 參考第1組
//possible because Accessor is public
DerivedAccessor : Accessor
{
void SomeMethod()
{
this.SetConnection(????) // you can't pass Connection, its not visible to Assembly2
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.