Je sais qu'il y a eu plusieurs réponses à cette question, et qu'elle est assez ancienne maintenant, mais la méthode la plus simple est de les déclarer en tant que new private
.
Prenons un exemple sur lequel je travaille actuellement, où j'ai une API qui rend disponible chaque méthode d'une DLL tierce. Je dois prendre leurs méthodes, mais je veux utiliser une propriété .Net, au lieu d'une méthode "getThisValue" et "setThisValue". Je crée donc une deuxième classe, hérite de la première, crée une propriété qui utilise les méthodes get et set, puis surcharge les méthodes get et set originales en tant que privées. Ils sont toujours disponibles pour quiconque veut construire quelque chose de différent, mais s'ils veulent juste utiliser le moteur que je construis, ils pourront utiliser les propriétés au lieu des méthodes.
L'utilisation de la méthode de la double classe permet de s'affranchir de toutes les restrictions liées à l'impossibilité d'utiliser la méthode de la double classe. new
pour cacher les membres. Vous ne pouvez tout simplement pas utiliser override
si les membres sont marqués comme virtuels.
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; }
}
Maintenant, valueEnum est disponible pour les deux classes, mais seule la propriété est visible dans la classe APIUsageClass. La classe APIClass est toujours disponible pour les personnes qui veulent étendre l'API originale ou l'utiliser d'une manière différente, et la classe APIUsageClass est disponible pour ceux qui veulent quelque chose de plus simple.
En fin de compte, ce que je vais faire, c'est rendre l'APIClass interne, et n'exposer que ma classe héritée.