Показать сообщение отдельно
Старый 28.09.2006, 14:38
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 9  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
По умолчанию 18. Права доступа

В ActionScript 3 добавлено два новых ключевых слова для описания прав доступа и усовершенствовано свойство private по сравнению с ActionScript 2. Итак, теперь мы имеем следующие ключевые слова для регулирования прав доступа:
  • public
  • protected
  • private
  • internal (по умолчанию)

public: то же самое, что и в ActionScript 2, все определенное как public может быть прочитано откуда угодно.
Конструкторы теперь всегда public.

protected: новое ключевое слово, указывает, что метод или переменная скрыта от всех кроме классов потомков.
Классы и конструкторы не могут быть определены как protected.

private: в ActionScript 2 было это ключевое свойство, но фактически работало как protected, т.е. классы потомки имели полный доступ к методу или свойству, описанному как private. Теперь в ActionScript 3 private это полноценная приватность, т.е. доступ только в этом классе, в котором метод или переменная описана, для всех остальных, включая потомков, она не будет существовать. Это означает, что в классе-потомке можно объявить еще одну переменную или метод с таким же именем и при этом не возникнет никаких конфликтов.
Классы и конструкторы не могут быть определены как private.

internal: аналогично public, но ограничено пределами пакета (package). Только классы, описанные в этом же пакете, будут иметь доступ к internal переменным или методам.
Internal ставится по умолчанию для любого класса, переменным или методам класса, кроме конструкторов, которые всегда public.

Права доступа во вспомогательных классах немного отличаются. Поскольку они фактически описываются вне пакета (package), то переменные или методы, объявленные как internal будут доступны только классам, описанным в этом же файле.

В ActionScript 3 проверка прав доступа осуществляется не только на этапе компиляции, но и при выполнении, т.е. хаки использовавшиеся в ActionScript 2, чтобы получить доступ к скрытым методам больше не будут работать.

Рассмотрим все это на примерах.
Пример 1.
Код:
package {
    
    import flash.display.Sprite;
    
    // Класс AccessControl  объявлен как public (по умолчанию был бы internal)
    public class AccessControl extends Sprite {
        
        // Конструктор всегда public
        function AccessControl() {
            
            // Только классы описанные в этом файле 
            // имеют доступ к вспомогательным классам
            var helper:Helper = new Helper();
            
            trace(helper.pubNum); // OK - это public
            // trace(helper.protNum); // Error – нет доступа к protected
            // trace(helper.privNum); // Error – нет доступа к private
            trace(helper.interNum); // OK - это internal
        }
    }
}

// Класс Helper по умолчанию internal
class Helper {
    
    // public – переменная видна отовсюду
    public var pubNum:Number = 1;
    
    // protected – доступ только из классов потомков
    protected var protNum:Number = 2;
    
    // private – доступно только в этом классе
    private var privNum:Number = 3;
    
    // internal – доступно только в этом же package,
    // но для вспомогательного класса это означает, 
    // что только для классов описанных в этом файле
    internal var interNum:Number = 4;
        
    // Конструктор всегда public
    function Helper() {
    }
}

// класс SubHelper будет internal
// Потомок вспомогательного класса Helper 
class SubHelper extends Helper {
    
    // Конструктор всегда public
    function SubHelper() {
        trace(pubNum); // OK – это public
        trace(protNum); // OK – т.к. мы являемся потомком
        // trace(privNum); // Error – нет доступа к private
        trace(interNum); // OK – в этом же файле
    }
}
Пример 2.
Код:
package {
    
    import flash.display.Sprite;
    import containers.*; // описано ниже
    
    // Класс AccessControl  объявлен как public (по умолчанию был бы internal)
    public class AccessControl extends Sprite {
        
        // Конструктор всегда public
        function AccessControl() {
            
            // Есть доступ из другого пакета (packages)
            // только если класс public
            var bowl:Bowl = new Bowl(); // OK
            // var basket:Basket = new Basket(); // Error – нет доступа к internal
            
            trace(bowl.pubNum); // OK
            // trace(bowl.protNum); // Error - нет доступа к protected
            // trace(bowl.privNum); // Error - нет доступа к private
            // trace(bowl.interNum); // Error - нет доступа к internal
        }
    }
}
Код:
package containers {

    // Класс public доступен везде
    public class Bowl {
        
        // Переменная public доступна везде
        public var pubNum:Number = 1;
        
        // protected – доступ только у наших потомков
        protected var protNum:Number = 2;
        
        // private – доступ только в этом классе 
        private var privNum:Number = 3;
        
        // internal – доступ только в этом пакете (package)
        internal var interNum:Number = 4;
            
        // Конструктор всегда public
        function Bowl() {
            
            // Есть доступ к inteneral т.к. в этом же пакете
            var basket:Basket = new Basket();
            
            trace(basket.pubNum); // OK
            // trace(basket.protNum); // Error – нет доступа к protected
            // trace(basket.privNum); // Error - нет доступа к private
            trace(basket.interNum); // OK – в этом же пакете
            
            // clone объявлен как public 
            var basketCopy:Basket = basket.clone();
        }
    }
}
Код:
package containers {
    
    // interal – доступ только в этом пакете (package)
    internal class Basket {
        
        // public – доступ отовсюду
        public var pubNum:Number = 1;
        
        // protected – доступ только у потомков
        protected var protNum:Number = 2;
        
        // private – доступ только в этом классе
        private var privNum:Number = 3;
        
        // internal – доступ только в этом пакете (package)
        internal var interNum:Number = 4;
        
        // Конструктор всегда public
        function Basket() {
        }
        
        // public – доступ отовсюду
        public function clone():Basket {
            var basket:Basket = new Basket();
            basket.pubNum = pubNum; // OK
            basket.protNum = protNum; // OK – этот же класс
            basket.privNum = privNum; // OK - этот же класс
            basket.interNum = interNum; // OK
            return basket;
        }
    }
}
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.