2015-10-29 9 views
5

W języku C# mamy akcesor protected, który pozwala członkom klasy być widocznymi na zasadzie dziedziczenia, ale nie dla pozostałych.Jaki jest poprawny sposób myślenia C# chronionego akcesora w szybkim tempie?

w Swift to nie istnieje, więc zastanawiam się, co to jest prawidłowe podejście do czegoś takiego:

chcę mieć zmienną (zachowanie wewnętrzny) i oraz sposób publiczny przy użyciu tej zmiennej w bazie klasa. Ta zmienna będzie używana również w przypadku dziedziczonych zdań.

Opcje widzę

  • Zapomnij o klasie bazowej i wdrożenie metod zmiennych i wszędzie go potrzebuję. WRONG, powielony kod
  • Dziedzictwo realizacji według składu. Stworzyłem klasę zawierającą popularne metody i będzie ona używana przez kompozycję zamiast dziedziczenia. LESS WRONG ale wciąż powtarzający się kod, którego można było uniknąć z dziedziczeniem
  • Dziedziczenie i wykonanie zmiennej wewnętrznej w klasie bazowej. WRONG ponieważ ujawnia rzeczy bez żadnego uzasadnienia, z wyjątkiem dopuszczania widoczności na odziedziczonych klauzulach.

Szczegóły wdrożeniowe dla klasy

bazowej chcę mieć NSOperationQueue instancji i publicznego oraz sposobu, aby anulować kolejce operacje. Dodaję nowe operacje do tej kolejki z dziedziczonych klas.

Odpowiedz

3

W Swift poprawną odpowiedzią są prawie zawsze protokoły i rozszerzenia. To prawie nigdy nie jest dziedziczenie. Czasami Cocoa stoi nam na drodze, ponieważ są klasy w Cocoa częściej niż protokoły, ale celem jest prawie zawsze protokół i rozszerzenie. Podklasy to nasz ostatni wybór.

Twój szczególny przypadek jest mylący, ponieważ NSOperationQueue ma już publiczną metodę anulowania operacji w kolejce (cancelAllOperations). Aby zabezpieczyć kolejkę przed dostępem z zewnątrz (na przykład uniemożliwić wywołującym używanie addOperation), należy umieścić kolejkę w innym typie (tzn. W składzie) i przesłać kolejkę do kolejki. Więcej szczegółów na temat konkretnego problemu, który rozwiązujesz, pomoże nam zasugerować inne rozwiązania podobne do Swift.

Jeśli na końcu potrzebujesz czegoś, co wygląda na protected lub friend, prawidłowe rozwiązanie to private. Umieść swoją podklasę lub przyjaciela w tym samym pliku z celem i zaznacz prywatną rzecz private. Ewentualnie umieść elementy, które muszą współpracować w ramach, i zaznacz atrybut internal. The Swift Blog stanowi dobre wyjaśnienie, dlaczego jest to celowy wybór.

+0

Świetna odpowiedź. Dzięki! – StackOverflower