我知道这有几个答案,现在已经很老了,但最简单的方法是将其声明为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