2015-06-01 5 views
1

Я хочу сделать что-то вроде этого:упаси переопределяет от вызова базы

public class MyClass { 
    public virtual void Foo() { 
    this.DoSomethingThatWouldBeFineInASubclassButAnOverrideWouldNotWantToUse(); 
    } 
} 

В принципе, я делаю некоторую работу здесь, и я хочу путь по умолчанию это делать, но если кто-то собирается отменить, они, скорее всего, НЕ будут использовать значение по умолчанию. Так легко поставить base.Foo() в переопределение, не задумываясь об этом; на самом деле моя IDE делает это автоматически. Я хочу это предотвратить. Является ли это возможным?

+0

Вы можете использовать «новое» ключевое слово, чтобы скрыть базовую реализацию. – HimBromBeere

+0

что делать, если вы делаете 'DoSomethingThatWouldBeFineInASubclassButAnOverrideWouldNotWantToUse' частным? Тогда его можно вызывать только из 'MyClass' –

+0

@NedStoyanov Но вы все равно можете называть' base.Foo() '. – juharr

ответ

6

Это лучше решить с помощью композиции вместо наследования. Может быть, с помощью strategy pattern:

interface ISomeStrategy 
{ 
    void Do(); 
} 

public class MyClass { 

    private readonly ISomeStrategy _strategy; 

    public MyClass() : this(null) {} 

    public MyClass(ISomeStrategy strategy) 
    { 
     // the default implementation and the user-defined implementation 
     // are mutually exclusive 
     _strategy = strategy ?? new DefaultStrategy(); 
    } 

    public void Foo() 
    { 
     _strategy.Do(); 
    } 

    //secret strategy 
    private class DefaultStrategy : ISomeStrategy 
    { 
     public void Do() 
     { 
      //secret implementation 
     } 
    } 
} 

подклассов:

public class Derived : MyClass 
{ 
    public Derived() : base(new DerivedStrategy()) 
    { 

    } 
} 

Немного более подробный, но эффективный.

+4

«Это лучше решить с композицией вместо наследования» - если бы я мог дать вам +100, я бы :) –

 Смежные вопросы

  • Нет связанных вопросов^_^