Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Базовый класс


Автор: zss 18.2.2005, 16:38
Что-то целый день мучаюсь и уже 10 раз переделываю smile

Есть некий класс. Необходимость в нем возникла из-за того, чтоб хранить данные в той последовательности в которой они были добавлены

Код

public class DoubleArray {

private ArrayList list = new ArrayList ();

   public int getSize () {
       return list.size ();
   }

public void addValue ( String key, String value ) {
 list.add ( new Struct ( key, value ) );
}

...
}

class Struct {

private String key;
private String value;

Struct ( String key, String value ) {
 this.key = key;
 this.value = value;
}

public String getKey () {
 return key;
}

public String getValue () {
 return value;
}
}



Есть абстрактный класс, котоый содержит массив объектов и массив данных (имена)
Код

public abstract class AbstractClass {

   private ArrayList objectList = new ArrayList ();
   private String arrayKey[];
   private String arrayName[];


...


Есть наследники, в которых эти данные различаются
Код


public class Class extends AbstractClass {

public final static int A = 0;
public final static int B = 1;
public final static int C = 2;

private static String[] arrayKey = {"Aaa", "Bbb", "Ccc"};
private static String[] arrayName = {"aaaaa", "bbbbb", "ccccc"};



Тоесть любой наследник содержит собственное описание и может являтся контейнером объектов.

Т.к. в DoubleArray реализована вся функциональность доступа к данным, то хотелось бы одним махом заполнить его данными (arrayKey & arrayName)

Вопрос:
1. можно ли так инициализировать массивы абстрактного класса.
2. Если использовать вместо массивов DoubleArray, то как его инициализировать

Автор: NotGonnaGetUs 18.2.2005, 17:15
Кто-то из нас ничего не понял.

1. В AbstractClass arrayKey и arrayName объявлены как private.

private static String[] arrayKey = {"Aaa", "Bbb", "Ccc"}; - инициализирует собственную переменныую в классе Class, причём статик.

2. private static DoubleArray doubleArray = new DoubleArray();
static {
doubleArray.addValue("Aaa", "aaaaa");
doubleArray.addValue("Baa", "bbbbb");
...
}
или добавь в doubleArray метод addValues(String[] keys, String[] names) и реализуй.
Если нужно "не статик" поле, то инициализируй его в конструкторе класса.

off:
DoubleArray - массив объектов Double.
Class - библиотечный java класс (java.lang.Class)



Автор: Tamerlann 18.2.2005, 18:35
А можно поподробнее, зачем вообще понадобился такой DoubleArray?

Автор: zss 18.2.2005, 20:49
Цитата(NotGonnaGetUs @ 18.2.2005, 17:15)
DoubleArray - массив объектов Double.
Class - библиотечный java класс (java.lang.Class)


Это я просто для примера привел smile

Цитата(Tamerlann @ 18.2.2005, 18:35)
А можно поподробнее, зачем вообще понадобился такой DoubleArray?


Хорошо - объясню подробнее.

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

Информация представляет собой строки ключ-значение (Properties не подходит, т.к. хранит данные в произвольном порядке, а надо в том порядке, в котором они были добавлены)

Данные: ключ - значение должны быть private, а доступ к ним происходит по индексу (для удобства анализа). Для получения значения используется ключ. А для получения ключа - индекс.

Также существует возможность parseKey для получения индекса ключа (тоже для удобства).

Если использовать массивы строк, то для каждого класса надо было бы писать методы доступа к данным и их инициализацию.

Поэтому я написал класс DoubleArray, который все это реализует, но инициализацию его и часть методов приходится повторять в каждом классе.

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

Пример (два разных класса)
Код

public class A  extends ...{

   private ArrayList list = new ArrayList();
   public final static int Q = 1;
   public final static int W = 2;

   String [] s1 = {"q", "w"}
   String [] s2 = {"qqq", "www"}

}
public class A extends ...{
   private ArrayList list = new ArrayList();

   public final static int D = 1;
   public final static int F = 2;

   String [] s1 = {"d", "f"}
   String [] s2 = {"ddd", "fff"}

}




А методы доступа данных реалихованы в базовом классе. Кроме того они являются контейнерами

Автор: Domestic Cat 18.2.2005, 21:05
Код

public class DoubleArray {

   protected ArrayList list = new ArrayList ();
   protected String [] s1;
   protected String [] s2;

   public int getSize () {
       return list.size ();
   }

   public void addValue ( String key, String value ) {
 list.add ( new Struct ( key, value ) );
   }

...
}
public class A1  extends DoubleArray {

   public final static int Q = 1;
   public final static int W = 2;
   
   public A1()
   {
       s1 = new String[] {"q", "w"};
       s2 = new String[] {"qqq", "www"};
   }
 
}
public class A2 extends DoubleArray {

   public final static int D = 1;
   public final static int F = 2;

   public A2()
   {
       s1 = new String[] {"d", "f"};
       s2 = new String[] {"fdgf", "fgfgfgfgf"};
   }

}


list будет тоже доступен сабклассам.

Автор: zss 18.2.2005, 21:23
Цитата(Domestic @ 18.2.2005, 21:05)
s1 = new String[] {"d", "f"}


Domestic Cat, прочитал книгу, которую ты рекомендовал, но такую инициализацию встречаю впервые smile

Спасибо - попробую

Автор: zss 18.2.2005, 21:35
Кстати, Domestic Cat, а если нужно, что массивы строк были static - так не получиться.

Ну чтобы к ним можно было обращаться не создавая объект

Автор: NotGonnaGetUs 18.2.2005, 21:45
Цитата(zss @ 18.2.2005, 21:35)
Кстати, Domestic Cat, а если нужно, что массивы строк были static - так не получиться.

Ну чтобы к ним можно было обращаться не создавая объект

static'и не наследуются.

Автор: zss 18.2.2005, 22:24
Тоесть придется все-таки создавать объект smile Пришли к тому, из-за чего я все это затевал smile

Мне просто хотелось описание доставать не создавая объект, а использовать его как контейнер - создав

Автор: djGri 21.2.2005, 18:51
Цитата
Необходимо создать классы, в которые являются контейнерами объектов. Но помимо этого содержат информацию о себе (каждый класс разную).

Это похоже на Composite Pattern

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)