zdarzyło mi się dowiedzieć, że nie wolno mieć abstrakcyjne pól prywatnych w cechę, że jestAbstrakt prywatne pola cechy Scala
trait A1 {
//private val a: Int // Not allowed
protected val b: Int // OK
}
i wydaje wszelkie prawa robić czegoś takiego do klasy abstrakcyjnej jeśli prywatne pola są parametry konstruktora, czyli
abstract class A2 (private val i: Int) // OK
więc myślę, że to cecha nie posiada parametrów konstruktora, więc nie ma sposób je zainicjować, dlatego nie abstrakcyjny prywatny FIE lds są dozwolone.
Jeśli są "chronione", wówczas podklasa może zainicjować je za pomocą wstępnie zainicjowanych pól . To podejście umożliwia wyświetlenie tych pól podklasą.
Co zrobić, jeśli chcę je zainicjować i ukryć później, , jak w poniższym przykładzie?
object holding {
trait trick {
protected val seed: Int // Can't be private
final def magic: Int = seed + 123
}
trait new_trick extends trick {
def new_magic: Int = magic + 456
def the_seed: Int = seed // [1]
}
def play: new_trick = new { val seed = 1 } with new_trick
def show_seed(t: new_trick): Int = t.the_seed // [2]
}
że nie ktoś chce się być w stanie dostrzec nasion, to [2] (a więc i [1]), nie powinny być dozwolone. Czy istnieje sposób, aby to zrobić?
Jak @Randall i @ pagoda_5b podkreśliło, moje pytanie nie ma większego sens. Ale na szczęście @ Régis i @ axel22 zamienili to w kolejne interesujące pytanie i dostarczyli wzór do jego rozwiązania.
Jak ważne jest posiadanie czegoś prywatnego i niezaimplementowanego? Jest to sprzeczność, ponieważ nie jest ona dziedziczona i nigdy nie może zostać zaimplementowana, a zatem uniemożliwiłaby utworzenie dowolnego podtypu cechy posiadającej takiego członka. –
Nie jestem pewien, czy podążam za tobą. Jeśli potrzebujesz podklas do zdefiniowania materiału siewnego (przesłonięcie jego definicji), nie ma sensu, aby było ono prywatne. To powiedziawszy, podklasa, która definiuje implementację elementu źródłowego, zawsze będzie w stanie pokazać go publicznie dostępnemu. Nie rozumiem potrzeby stojącej za tym wyborem. –
Myślę, że sprowadza się to do tego, że bezpośrednia sub-cecha definiuje wartość "nasiona", a dalsze podkategorie (i kod zewnętrzny) nie mogą uzyskać dostępu do wartości. Coś w rodzaju wartości chronionej (traktuj jako wartość chronioną dla podtekstów i traktuj jako prywatne dla wszystkiego, co lese). Co do znaczenia, myślę, że chodzi o to, aby w pełni naśladować, co można zrobić za pomocą parametrów (w klasach), jak pokazano w jego przykładzie. –