AKTUALIZACJA: To pytanie było przedmiotem mojego bloga we wrześniu 2014 r . Dzięki za świetne pytanie!
Trwa debata na ten temat, nawet w samym zespole kompilatorów.
Po pierwsze, dobrze jest zrozumieć zasady. Publiczny członek klasy lub struktury to członek, który jest dostępny dla wszystkiego, co może uzyskać dostęp do typu zawierającego . Publiczny członek klasy wewnętrznej jest więc efektywnie wewnętrzny.
Czy teraz, biorąc pod uwagę klasę wewnętrzną, jej członkowie, do których chcesz uzyskać dostęp w zgromadzeniu, powinni być oznaczeni jako publiczni czy wewnętrzni?
Moja opinia jest taka: oznacz takich członków jako publiczną.
Używam słowa „public”, co oznacza, że „ten członek nie jest szczegółem implementacji”. Chroniony członek jest szczegółem implementacji; jest coś w tym, co będzie potrzebne, aby klasa pochodna działała. Element wewnętrzny jest szczegółem implementacji; coś innego wewnętrznego w tym zespole potrzebuje członka, aby działać poprawnie. Członek publiczny mówi: „ten członek reprezentuje kluczową, udokumentowaną funkcjonalność zapewnianą przez ten obiekt”.
Zasadniczo mam takie podejście: załóżmy, że postanowiłem przekształcić tę klasę wewnętrzną w klasę publiczną. Aby to zrobić, chcę zmienić dokładnie jedno : dostępność klasy. Jeśli przekształcenie klasy wewnętrznej w klasę publiczną oznacza, że muszę również przekształcić członka wewnętrznego w członka publicznego, wówczas ten członek był częścią publicznego obszaru klasy i powinien był być przede wszystkim publiczny.
Inni ludzie się nie zgadzają. Istnieje kontyngent, który mówi, że chcą móc rzucić okiem na deklarację członka i od razu wiedzieć, czy będzie wywoływana tylko z kodu wewnętrznego.
Niestety nie zawsze działa to dobrze; na przykład klasa wewnętrzna, która implementuje interfejs wewnętrzny, nadal musi mieć elementy implementujące oznaczone jako publiczne, ponieważ są one częścią publicznej powierzchni klasy .