我知道这个问题已经有了几个答案,而且现在很老了,但是最简单的方法就是将它们声明为
new private
。
考虑一个我正在处理的示例,其中我有一个API,可以使用第三方DLL中的每个方法。我必须使用它们的方法,但我想使用.Net属性,而不是“getThisValue”和“setThisValue”方法。因此,我建立了第二个类,继承了第一个类,创建了一个使用get和set方法的属性,然后将原始的get和set方法覆盖为私有。它们仍然可供任何想要在其上构建不同内容的人使用,但如果他们只想使用我正在构建的引擎,则可以使用属性而不是方法。
使用双类方法消除了无法使用
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或以不同方式使用它的人使用,而APIUsageClass则适用于那些想要更简单东西的人。
最终,我将使APIClass成为内部类,只公开我的继承类。
Obselete
只会发出警告,这是不正确的,因为true
作为第二个参数会导致编译器错误而不是警告 - 正如你直接评论的答案所述。如果我误解了你,我欢迎澄清。这是MSDN来源。 - Robert Petz