Это не совсем то же самое, как вы просите, но это достигается подобный эффект ...
Почему бы не определить интерфейс для операций. ClassA реализует интерфейс. Ваши пользовательские стратегии также реализуют интерфейс. ClassA внутренне создает «по умолчанию» реализацию интерфейса при запуске (когда экземпляр ClassA создается), но также имеет свойство, позволяющее установить интерфейс. Интерфейс может даже позволить пользовательской стратегии, чтобы указать, какие члены интерфейса, что он на самом деле реализует:
interface IStrategy
{
void Operation1(int x, int y);
void Operation2(string a, string b);
}
class ClassA : IStrategy
{
private IStrategy builtInStrategy = new BuiltInStrategy();
public IStrategy CustomStrategy { get; set; }
void Operation1(int x, int y);
{
if (CustomStrategy != null)
{
CustomStrategy.Operation1(x, y);
}
else
{
builtInStrategy.Operation1(x, y);
}
}
void Operation2(string a, string b)
{
if (CustomStrategy != null)
{
CustomStrategy.Operation2(a, b);
}
else
{
builtInStrategy.Operation2(a, b);
}
}
}
Вы можете указать в качестве части IStrategy интерфейса путь для пользовательской стратегии, чтобы указать, что это не «наиважнейшая «конкретная операция. Возможно, он мог бы вернуть bool
, а не пустоту, или, возможно, каждая операция может иметь параметр out bool
, для которого установлено значение «ложь», если пользовательская стратегия не переопределила операцию.
В зависимости от того, сколько операций можно переопределить, вы можете даже рассмотреть возможность включения каждой операции в свой собственный интерфейс. Операции могут быть сгруппированы в интерфейсе, если нецелесообразно реализовывать одну операцию, не выполняя некоторые другие операции.
interface IOperation1
{
void Operation1(int x, int y);
}
interface IOperation2
{
void Operation2(string a, string b);
}
interface IMath
{
int Add(int i, int j);
int Subtract(int i, int j);
int Multiply(int i, int j);
int Divide(int i, int j);
}
interface IStrategy
{
//What operations should the Strategy have?
}
class ClassA : IOperation1, IOperation2, IMath
{
public IStrategy CustomStrategy { get; set; }
public void Operation1(int x, int y)
{
IOperation1 op1 = CustomStrategy as IOperation1;
if (op1 != null)
{
op1.Operation1(x, y);
}
else
{
//Do ClassA's Operation1 logic here
}
}
public void Operation2(string a, string b)
{
IOperation2 op2 = CustomStrategy as IOperation2;
if (op2 != null)
{
op2.Operation2(a, b);
}
else
{
//Do ClassA's Operation2 logic here
}
}
//
// And so on ...
//
}
Просьба уточнить: Вы хотите отменить/тень/скрыть метод иностранного класса ? И вы действительно хотите это сделать во время выполнения *, а не * время разработки *? – Bobby
@Bobby: Shadowing не поможет одному бит во время выполнения. Он разрешается во время компиляции. – leppie
@leppie: Вот почему я спросил, что он * действительно хочет делать. – Bobby