2014-01-06 2 views
3

Всякий раз, когда я определяю частный метод, как это:Как создать частные методы, которые можно переопределить в подклассах в Dart?

class ParentClass { 

    sayHi() { _initiateGreeting(); } 
    _initiateGreeting() { print("I'm a parent class"); } 

} 

Это не представляется возможным переопределить его в подклассе:

class ChildClass { 
    _initiateGreeting() { print("I'm a child class"); } // redefining the method 
} 

Теперь, если я создаю экземпляр ChildClass и вызвать sayHi() метод, то это частный метод из ParentClass, который на самом деле вызывается:

var child = new ChildClass(); 
child.sayHi(); // outputs "I'm a parent class" 

Если howev er, _initiateGreeting() становится общедоступным (то есть снимается с _), а затем вызывается child.sayHi(). Результаты выводятся I'm a child class.

Почему? Как переопределить частный метод, чтобы он вызывался в подклассе?

ответ

1

Частный член можно посмотреть как член библиотеки. Внутри библиотеки нет различий между участниками с или без предварительного подчеркивания.

Итак, если вы находитесь в одной и той же библиотеке, вы сможете переопределить метод в подклассе.

+1

Это интересно. Но что, если 'ParentClass' принадлежит библиотеке, то есть' '' '' '' оператора в верхней части файла, который содержит 'ParentClass', в то время как' ChildClass' не является частью этой библиотеки (что, по иронии судьбы , мое дело)? – snitko

+0

Ожидается ли, что 'ChildClass' не расширит' ParentClass' в фрагменте кода? 'часть' не должна влиять на конфиденциальность. –

+1

Я сделал несколько копаний, и похоже, что выражение 'part of' действительно влияет на возможность переопределения частного метода или нет: https://groups.google.com/a/dartlang.org/forum/#!msg/misc/ XZ0pqeqCeVs/j3QdGO_ZZmUJ – snitko