2013-08-14 4 views
2

Предположим, у вас есть следующие цепочки наследования:IDisposable с несколькими уровнями наследования

class A : IDisposable 
{ 
    public void Dispose()... 
    protected virtual void Dispose(bool disposing)... 
} 

class B : A 
{ 
    // Virtual or Override for B? 
} 

class C : B 
{ 
    protected override void Dispose(bool disposing)... 
} 

Если A, B и C имеют свои собственные IDisposable ресурсы, как следует B объявить Dispose(bool)?

+1

Можно ли объявить два недействительными Dispose без каких-либо Params в одном классе? – Alex

+3

Вы просто называете 'base.Dispose()' и свободны для ресурсов 'B'. В чем проблема? – Sinatr

+1

Образец фактически требует 'protected virtual void Dispose (bool disposing)', поэтому ваш вопрос перед тем, как вы начали. – spender

ответ

3

Вы должны переопределение, не скрыть:

class A : IDisposable 
{ 
    public void Dispose() { 
     Dispose(true); 
     GC.SuppressFinalize(this); // <- May be excluded 
    } 

    protected virtual void Dispose(Boolean disposing)... // <- "disposing" recommended by Microsoft 
} 

class B : A 
{ 
    protected override void Dispose(Boolean disposing) { 
     // Dispose here all private resources of B 
     ... 
     base.Dispose(disposing); 
    } 
} 

class C : B 
{ 
    protected override void Dispose(Boolean disposing) { 
     // Dispose here all private resources of C 
     ... 
     base.Dispose(disposing); 
    } 
} 
+0

Отметить это как ответ, потому что вы обращаетесь к части переопределения и необходимо вызвать 'base.Dispose()'. Я чувствую себя манекеном, задающим этот вопрос сейчас, я это знал! – Didaxis

3

Он должен объявить его с помощью override. Если он объявит, используя virtual вместо override, то это будет скрытьA.Dispose.

Кстати, вы не можете объявить два метода Dispose в пределах A, оба без параметров (они не могут дифференцироваться по типу возврата или аксессуарам).

+1

Спасибо, это была опечатка с моей стороны. – Didaxis

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