我知道這有幾個答案,現在已經很老了,但最簡單的方法是將其聲明爲new private
。
考慮一個我目前正在使用的示例,其中有一個API可用於第三方DLL中的每個方法。我必須採取他們的方法,但我想使用.Net屬性,而不是「getThisValue」和「setThisValue」方法。因此,我構建了第二個類,繼承第一個類,使用get和set方法創建一個屬性,然後將原始get和set方法重寫爲private。任何想要在它們上面構建不同的東西的人都可以使用它們,但是如果他們只是想使用我正在構建的引擎,那麼他們就可以使用屬性而不是方法。
使用雙類方法擺脫了無法使用new
聲明來隱藏成員的任何限制。如果成員標記爲虛擬,則無法使用override
。
public class APIClass
{
private static const string DllName = "external.dll";
[DllImport(DllName)]
public extern unsafe uint external_setSomething(int x, uint y);
[DllImport(DllName)]
public extern unsafe uint external_getSomething(int x, uint* y);
public enum valueEnum
{
On = 0x01000000;
Off = 0x00000000;
OnWithOptions = 0x01010000;
OffWithOptions = 0x00010000;
}
}
public class APIUsageClass : APIClass
{
public int Identifier;
private APIClass m_internalInstance = new APIClass();
public valueEnum Something
{
get
{
unsafe
{
valueEnum y;
fixed (valueEnum* yPtr = &y)
{
m_internalInstance.external_getSomething(Identifier, yPtr);
}
return y;
}
}
set
{
m_internalInstance.external_setSomething(Identifier, value);
}
}
new private uint external_setSomething(int x, float y) { return 0; }
new private unsafe uint external_getSomething(int x, float* y) { return 0; }
}
現在valueEnum可用於兩個類,但只有該屬性在APIUsageClass類中可見。 APIClass類仍然適用於想要擴展原始API或以不同方式使用API的人,並且APIUsageClass適用於想要更簡單的用戶。
最終,我會做的是使APIClass內部,並只暴露我的繼承類。
你能不能封住它,同樣的效果呢? – 2017-01-19 16:51:57
@詹姆斯沒有obselete真正的防止成員_access_,密封防止成員_inheritance_。所以一個密封的類不能被派生出來,並且一個密封的方法允許其他類成員被覆蓋,但是阻止該成員被覆蓋。密封不會阻止調用該類或成員,而如果嘗試調用它,則使用真正的obselete會拋出編譯器錯誤。 – 2017-05-25 15:31:26