AS3 - Повторить / Привести наследуемую переменную навсегда в подклассе? - PullRequest
1 голос
/ 24 июня 2011

Возможно, это плохая практика, но я все равно плохо разбираюсь в разработке программного обеспечения (я уверен, что этот вопрос задавали бы раньше, но я не могу найти правильную терминологию) ... Во всяком случае, это просто еще одно любопытствоя бы хотел ответить.

Итак, я работал так, что я набираю переменную базового класса для типа Object или Sprite или чего-то подобного, чтобы в моих подклассах я мог создавать свои собственные классыв них и хранить его.И когда я обращаюсь к нему, я просто приводил эту переменную, чтобы убедиться, что у меня есть доступ к методам.

Возьмите этот пример, чтобы вы знали, о чем я говорю:

public class BaseClass
{
  protected var the_holder_var:Object;

  public function BaseClass()
  {
    //Whatever abstract implementation here...
  }
}

Теперь, мои подклассы этого базового класса обычно используют интерфейс, но для простоты я просто напишу это без него.

public class AnExtendedClass extends BaseClass
{
  public function AnExtendedClass()
  {
    //Instantiate my own class into the base class variable
    this.the_holder_var = new ACustomClassOfMine(); 

    //Then I can use the 'hackish' getter function below to 
    //access the var's functions.
    this.holder_var.somefunction()
  }

  private function get holder_var():ACustomClassOfMine
  {
    return this.the_holder_var as ACustomClassOfMine;
  }
}

Это работает, и я уверен, что это вызовет некоторую нехватку ppl (я иногдасъеживаться тоже).Итак, теперь мой вопрос, есть ли способ переписать / перепечатать этот базовый var в моем расширенном подклассе?

вроде как:

public class ExtendedClass extends BaseClass
{
  //Not possible I know, but as a reference to see what I'm asking about
  //Just want to change the type....
  override protected var the_holder_var:ACustomClassOfMine;

  public function ExtendedClass()
  {
    //Then I can forget about having that hackish getter method.
    this.the_holder_var = new ACustomClassOfMine();
    this.the_holder_var.somefunction();
  }
}

Я думал о наборе большей части моей базыклассовые переменные, которые я использую в качестве держателей в качестве типа * и перепечатываю их по мере расширения класса.(Я мог бы использовать это здесь, но да ...) Мысли?Комментарии?Идеи?

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Я действительно думаю, что ваш код (кроме гипотетического добавления в конце) довольно хорошо.Практика добавления аксессоров для решения типовой проблемы, с которой вы имеете дело, является надежной.Я бы посоветовал переименовать аксессор, чтобы показать, что это актерский состав, возможно get holderVarAsCustom():ACustomClassOfMine (я тоже не большой поклонник подчеркиваний, это соглашение другого языка), но это личное предпочтение.Что бы я сделал, чтобы решить вашу последнюю проблему - просто создать подходящую функцию установки:

private function set holderVarAsCustom(value:ACustomClassOfMine):void {
  this.the_holder_var = value;
}

Таким образом, вы можете получить доступ к правильно набранному держателю var для операций чтения и записи с полной безопасностью типов:

holderVarAsCustom = new ACustomClassOfMine();
holderVarAsCustom.someFunction();

Я бы определенно рекомендовал не снижать безопасность типов, включая массивы, а что нет, это просто делает его нестабильным.

0 голосов
/ 24 июня 2011

Я бы не стал пытаться изменить это поведение, так как вы не можете изменить объявленный тип переменной после ее объявления независимо от того, как сильно вы пытаетесь.Что я делаю в таких случаях, я либо приведу переменную, если использую ее экономно, либо объект, на который она ссылается, может измениться, либо я добавляю другую переменную нужного типа и позволяю другой переменной указывать на новую.Например:

public class A {

    protected var object:Object;

    public function A() {
        //Whatever abstract implementation here...
    }

}

и

public class B extends A {

    protected var other:MyClass;

    public function B() {
        super();
        this.other = new MyClass();
        this.object = this.other;
    }

}

При таком способе класс A использует объект через ссылку this.object, а класс B может использовать this.other или оба,Но обе ссылки указывают на один и тот же объект.Единственные проблемы с этим:

  • наличие двух ссылок на один и тот же класс для одного и того же объекта является уродливым (как и нетипизированные переменные и приведение)
  • если объект один из нихМожет точка может измениться во время выполнения, вы должны быть очень осторожны, чтобы синхронизировать эти изменения
0 голосов
/ 24 июня 2011

Я должен признать, что я немного смущен тем, почему вы хотите это сделать, но здесь идет. Не могли бы вы использовать тот факт, что массивы могут содержать различные типы данных. Так что-то вроде этого:

public class BaseClass
{
      protected var customStorage:Array;

      public function BaseClass()
      {
        //Whatever abstract implementation here...
      }
}

Затем вы можете получить к нему доступ с помощью ассоциативного метода и свойства:

public class AnExtendedClass extends BaseClass
{
   private static const myName:String = "myName";

   public function AnExtendedClass()
   {
     //Instantiate my own class into the base class variable
     customStorage[myName] = new ACustomClassOfMine(); 
     objectIWant.somefunction()
   }

   private function get objectIWant():ACustomClassOfMine
   {
     return ACustomClassOfMine(customStorage[myName]);
   }
}

Это лучше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...