Невозможно делать то, что вы хотите, с наследованием.
Кажется, у вас нет намерения переопределять, вы просто хотите "наследовать" поведение от базового класса выборочно.Вы можете сделать это, используя отношение «имеет»:
public class Base
{
internal Base() {} //mark constructor as internal so it can not be used outside your assembly if necessary
public Foo Mehtod1() {...}
public Foo Mehtod2() {...}
public Foo Mehtod3() {...}
}
Затем просто выполните следующее:
class A
{
private Base internalBase;
public A() { this.internalBase = new Base(); }
public Foo Method1() { return this.internalBase.Method1(); }
}
class B
{
private Base internalBase;
public A() { this.internalBase = new Base(); }
public Foo Method2() { return this.internalBase.Method2(); }
public Foo Method3() { return this.internalBase.Method3(); }
}
ОБНОВЛЕНИЕ: Возможное альтернативное решение -сделайте ваши Base
методы класса virtual
и переопределите их все в ваших производных классах, добавив NotSupportedException
s в те методы, которые вы не хотите, чтобы класс сделал доступными.Мне не очень нравится это решение, но оно имеет то преимущество, что не теряет наследование полиформизма, что может быть полезно, если у вас есть базовая базовая функциональность, которой поделятся все производные классы (в вашем примере вы, похоже, подразумеваете, что они этого не сделают).