2016-10-27 7 views
6

W systemie Android tworzę abstrakcyjną klasę, która rozciąga się na View (klasę Androida, do której nie mam dostępu). Abstrakcyjna klasa nadrzędna widokówCzy dodawanie ostatecznego słowa kluczowego do metody dziedziczonej/przesłoniętej jest "ok"?

@Override 
protected final void onDraw(Canvas canvas) { 
    if(conditions) return;   

    // child classes should only draw if this class gives the ok 
    subDraw(canvas); 
} 

protected abstract void subDraw(Canvas canvas); 

jednak dodałem ostatecznego słowa kluczowego tutaj.

Chodzi o to, że tworzę abstrakcyjną metodę, którą powinny używać podklasy zamiast onDraw. Dlatego zapobiegam nadpisywaniu onDrawu i działa.

Wiem, że istnieją projekty, które poprawią to działanie, ale działa to jak urok bez większych zmian. Moje pytanie jest bardziej ogólne, jeśli powyższe ma niepożądane skutki uboczne w czasie wykonywania lub innych problemów?!

+5

tak, jeśli to "zachowanie, które chcesz i wiesz, co robisz – Blackbelt

+0

to jest dokładnie to, co chcę – NikkyD

+0

Efektem ubocznym jest to, że sprawia, że ​​twoje podklasy trudniej jest testować (unit-). To dlatego, że nie możesz kpić z tej metody. A zatem nie można oddzielić zachowania podklas od zachowania klas. Są sposoby na rozwiązanie tego problemu, ale stosując podejście "faworyzuj kompozycję ponad dziedziczność", które najlepiej byłoby zastosować w projektowaniu aplikacji. –

Odpowiedz

2

Tak, technicznie jest to czyste rozwiązanie. Jeśli jesteś absolutnie pewny, że nie ma sytuacji, w której ktoś mógłby chcieć zmienić jakąkolwiek logikę w tej konkretnej metodzie, mógłbyś to zrobić.

Należy również pamiętać, że ta metoda musi zawierać najmniej logiczną możliwą, ponieważ nie może być zmieniona przez żadnego potomka. Jeśli uważasz, że ta metoda będzie się powiększać (bez korzystania z delegatów), unikaj jej finalizacji.

Powiązane problemy