Я знаю, что на это было несколько ответов, и сейчас это довольно старый, но самый простой способ сделать это - просто объявить их как 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 внутренним, и только выдать мой унаследованный класс.
Можете ли вы запечатать его, также, с тем же эффектом? – 2017-01-19 16:51:57
@JamesM no obselete with true предотвращает член _access_, запечатанный предотвращает член _inheritance_. Таким образом, закрытый класс не может быть получен, и закрытый метод позволяет переопределить другие члены класса, но не позволяет этому члену переопределяться. Запечатанное не препятствует вызову этого класса или члена, в то время как obselete с true вызывает ошибку компилятора, если вы попытаетесь вызвать его. – 2017-05-25 15:31:26