Począwszy od follwing sytuacji:Zadeklarować IDisposable dla klasy lub interfejsu?
public interface ISample
{
}
public class SampleA : ISample
{
// has some (unmanaged) resources that needs to be disposed
}
public class SampleB : ISample
{
// has no resources that needs to be disposed
}
Klasa SampleA powinny wdrożyć IDisposable interfejsu do zwalniania zasobów. Można to rozwiązać na dwa sposoby:
1. Dodać wymaganą interfejs klasy SampleA:
public class SampleA : ISample, IDisposable
{
// has some (unmanaged) resources that needs to be disposed
}
2. dodać go do ISample interfejsu i siła wynikająca zajęcia do jego realizacji:
public interface ISample : IDisposable
{
}
Jeśli wstawisz go do interfejsu wymusić realizację dowolnego celu realizacji IDisposable, nawet jeśli nie mają nic do dysponowania. Z drugiej strony bardzo wyraźnie widać, że konkretna implementacja interfejsu wymaga bloku utylizacji/używania i nie trzeba go używać jako odczytywalnego do czyszczenia. Może być trochę plusów/minusów w obie strony ... dlaczego sugerowałbyś, aby preferować jedną preferowaną metodę?
Jakie jest prawdopodobieństwo, że kod napisany na interfejsie (przypuszczalnie zostanie przekazany już skonstruowaną instancją) jest odpowiedzialny za * zakończenie * (użytecznego) okresu istnienia tej instancji? –
@Damien_The_Unbeliever: Ok, zakładając, że ISample pochodzi z wyniku metody fabryki lub poprzez Dependency Injection. – Beachwalker
To jest rzecz - jeśli * pochodzi * z fabryki, prawdopodobnie twój kod * jest * odpowiedzialny za usunięcie - więc umieściłbym go w interfejsie. Ale jeśli jest on wstrzykiwany, to zakładam, że wtryskiwacz jest odpowiedzialny za całe życie, więc * nie pasowałoby do interfejsu - nie sądzę, że istnieje odpowiednik uniwersalny dla tego pytania. –