Я знаю, что было несколько ответов на это, и сейчас оно довольно старое, но самый простой способ сделать это - просто объявить их как 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 и выставлять только мой унаследованный класс.