![]() |
|
||||||||||
|
|||||
|
Регистрация: May 2011
Сообщений: 76
|
Вопрос касается объявления кастомных неймспесов, создания методов с ними и их переопределение.
Сразу оговорюсь что пользуюсь intellij idea 12+. Я могу определить методы в своем неймспесе и их использовать внутри класса, в котором они определены, но не могу переопределить их в дочерних классах, так как на них ругается компилятор(синтаксический анализор идеи молчит). Для примера я привел небольшую иерархию как она не работает. Есть такая структура: package test { public class namespace_1 { public namespace namespace_1; } } package test { public class namespace_2 { public namespace namespace_2; } } package test { import test.namespace_1; import test.namespace_2; public class Class1 { private var mode:Namespace = namespace_1;// понятное дело что в других методах присвоить можем что хотим. .... protected function action():void { .... mode::foo(); } namespace_1 function foo():void { trace("foo in NS1 operating"); } namespace_2 function foo():void { trace("foo in NS2 operating"); } } } package test { import test.namespace_1; import test.namespace_2; //uses protected function action() from Class1. public class Child1 extends Class1 { // COMPILE TIME ERROR:: Namespace was not found or is not a compile-time constant. // If i define use namespace namespace_1 before class declaration error changes to // Method marked override must override another method. override namespace_1 function foo():void { trace("foo from Child1 in NS1 operating"); } } } package test { import test.namespace_1; import test.namespace_2; //uses protected function action() from Class1. public class Grandchild1 extends Child1 { // COMPILE TIME ERROR:: Namespace was not found or is not a compile-time constant. // If i define use namespace namespace_1 before class declaration error changes to //Method marked override must override another method. override namespace_1 function foo():void { trace("foo from Grandchild1 in NS1 operating"); } } } Пожалуйста помогите разобратся с этой темой, кто шарит. З.Ы. Я перешарил весь форум в поисках ответа или годного примера, но его не нашел. Помню был тред в котором обсуждалась возможность перегрузки методов во флеше и кто-то хвастался как он ловко запилил неймспейсы для использования "своей перегрузки" в своей игрушке( фича изменяла режим работы какой-то внутриигровой хреновины: нормальный и турбо) В общем если кто-то это помнит или встречал буду очень признателен за ссылку. Последний раз редактировалось searinox; 01.08.2013 в 23:35. |
|
|||||
|
Modus ponens
|
Сейчас не на чем попробовать, но вообще доступ к члену пространства имен либо через :, либо через ::. Т.е. я бы попробовал:
или
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: May 2011
Сообщений: 76
|
Цитата:
Сначала должно идти ключ. слово override, потом неймспейс. тут пример в конце http://help.adobe.com/en_US/ActionSc...0204-7f9e.html Хотя это всеравно не помогает( Последний раз редактировалось searinox; 01.08.2013 в 23:34. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
У меня тоже не получилось заставить наследника видеть объявленные в пакете неймспейсы.
Если в наследнике объявить заново неймспейсы с теми же литералами (uri), то все работает. Либо объявить неймспейсы в суперклассе, но опять же, прописав литералы руками (поскольку это константы, ссылки на объявленные вовне неймспейсы не сработают, как и ссылки на литералы вовне // строковые константы в отдельном файле).
__________________
Reality.getBounds(this); |
|
|||||
|
Рабочий пример с переопределением метода область видимости которого определена неймспейсом
OverrideNamespaceMethods.rar ТС. немного не правильно подошел к реализации.
__________________
местонахождение |
|
|||||
|
Регистрация: May 2011
Сообщений: 76
|
Цитата:
2) Задача была именно в том что бы метод, вызывающий занеймспейсеный метод был в том же классе и наследовался. В общем у тебя структура не такая как описал я в примере. 3) и самое главное - никаких use namespace в классе. заметь что неймспейс может менятся динамически и то что ты написал не подходит. |
|
|||||
|
надеюсь в этот раз я правильно понял.
package { import flash.display.Sprite; import flash.events.Event; /** * @author SlavaRa */ public class Main extends Sprite { use namespace $test_public; public function Main():void { super(); var test:Test2 = new Test2(); test._namespace1::test(); test._namespace2::test(); const namespaces:Vector.<Namespace> = new <Namespace>[_namespace1, _namespace2]; for(var i:int = 0; i < 10; i++) { const ns:Namespace = namespaces[int(Math.random() * namespaces.length)]; test.ns::test(); } } private var _namespace1:Namespace = $test_namespace1; private var _namespace2:Namespace = $test_namespace2; } } namespace $test_namespace1 = "$test_namespace1"; namespace $test_namespace2 = "$test_namespace2"; class Test { public function Test() { super(); } $test_namespace1 function test():void { trace("Test.$test_namespace1::test"); } $test_namespace2 function test():void { trace("Test.$test_namespace2::test"); } } class Test2 extends Test { public function Test2() { super(); } $test_namespace1 override function test():void { trace("Test2.$test_namespace1::test"); super.$test_namespace1::test(); } $test_namespace2 override function test():void { trace("Test2.$test_namespace2::test"); super.$test_namespace2::test(); } }
__________________
местонахождение |
|
|||||
|
Регистрация: May 2011
Сообщений: 76
|
Цитата:
Цитата:
На данном этапе все свелось к 2 костылям: 1) Или в родительском классе сделать метод protected, namespace_1, namespace_2, и в потомках переопределять protected вариант, так как в них юзается только один вариант метода, а не оба. 2) В родителе заново определять неймспейс с теми же литералами(и отказаться от автоматических литералов, которые симпатичнее). |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
public namespace ns1 = test.Namespace1 // package test { public namespace Namespace1 = "ns_1" } // или public namespace ns2 = test.NamespacesList.NAMESPACE_2 // строковая константа в классе NamespacesList Хелп говорит, что первый метод должен работать, однако компилятор утверждает что не знает никакого test.Namespace1. При этом сами методы класса, объявленные с этим же неймспейсом, у него проблем не вызывают((( Явно какой-то баг. Добавлено через 14 минут То есть вот так нельзя (не может инициализировать неймспейсы ссылками на объявленные в пакете неймспейсы) package test { public class Class_1 { public namespace ns1 = test.Namespace1; public namespace ns2 = test.Namespace2; public function Class_1() { } public function activation(mode:Namespace):void { mode::foo(); } ns1 function foo():void { trace("foo in NS1 operating"); } ns2 function foo():void { trace("foo in NS2 operating"); } } } package test { public class Class_1 { public function Class_1() { } public function activation(mode:Namespace):void { mode::foo(); } test.Namespace1 function foo():void { trace("foo in NS1 operating"); } test.Namespace2 function foo():void { trace("foo in NS2 operating"); } } } package test { public class Class_1 { public namespace ns1 = "n1"; public namespace ns2 = "n2"; public function Class_1() { } public function activation(mode:Namespace):void { mode::foo(); } ns1 function foo():void { trace("foo in NS1 operating"); } ns2 function foo():void { trace("foo in NS2 operating"); } } }
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 02.08.2013 в 15:20. |
|
|||||
|
[+1 25.10.13]
[+4 18.03.14] |
Ну у скиннера же есть пример как делать
http://dump.thekeppleeffect.com/NamespaceStrategy.as |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:55. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| AS3 , namespace , головоломка. |
|
|