Работа через интерфейсы

  • Автор темы systemscoders
  • Дата начала
S

systemscoders

#1
Доброго времени суток. Я в программировании на java начинающий. Есть трудности. Буду рад любым подсказкам...ссылкам , словом любой помощи.
Есть созданный класс для работы с вектором созданным на основании массива (обработка исключений еще не прописаны) и вектор на основании односвязного списка:
Код:
package codersys.Vector;

public class Array implements Vectorable {

public Array(double arr[]) {

.......
}

public double getElement(int index) {

......................
}

public void setElement(int index, double data) {

.....................
}

public int getLength() {

........................
}

}
и

Код:
package codersys.Vector;

public class List implements Vectorable {

private static class ListItem{

double item;
ListItem next;

private ListItem(double value, ListItem refnext){

item = value;
next = refnext;
}
}

private int listlength = 0;
private ListItem first = null;
private ListItem last = null;

public List() {};

private double getItem(ListItem current){

..........
}

private boolean isEmpty (ListItem current ) {

..........
}

private ListItem getNext(ListItem current){

.........
}

private void setItem(double value, ListItem current){

.........
}

public void addElement (double item){

........
}

public void addElement(int index, double value){

..........
}

public void delElement() {

...........
}

public int getLength (){

............
}

private ListItem visitor (int index){

.............
}

public double getElement(int index){

............
}

public void setElement(int index, double value){

...........
}

public void delElement(int index) {

...........
}

}
Эти два класса реализуют интерфейс:
Код:
package codersys.Vector;

interface Vectorable {

double getElement(int index);
void setElement(int index, double value);
int getLength();
}
Есть отдельный класс , который имеет два статических метода для сложения или вычисления скалярного произведения двух векторов. Его нужно записать таким образом, что бы он мог работать со ссылками типа интерфейс, :) ... вот тут то я не могу разобраться. Какого типа должны быть входные параметры..... как нужно работать в тестирующем классе через интерфейс.... свои наброски ...со знаками вопроса я привожу ниже:
Код:
package codersys.Vector;

public class VectorMath{

public static void getSum(???? v1, ???? v2 ){

for (int i = 1; i <= v1.getLength(); i++){
v1.setElement(i, (v1.getElement(i) + v2.getElement(i)));
}
}



public static double getScalar(???? v1, ????? v2 ){


double d = 0;
for (int i = 1; i <= v1.getLength(); i++){
d += v1.getElement(i) * v2.getElement(i);
}
return d;
}
и кусочек тестирующего класса:
Код:
			??????????????;

System.out.println("\n\r\n\r");
System.out.println("V1 - Other Vector for sum and scal mul from Array type :");
double[] v1 = {10,20,30,40,50,60,70,80};
???? vv1 = new Array(v1);
System.out.println("\n\r\n\r");
for (int i = 1; i <= vv1.getLength(); i++){
System.out.print( vv1.getElement(i) + " " );
}

System.out.println("\n\r\n\r");
System.out.println("V2 - Other Vector for sum and scal mul from List type :");
double[] v2 = {1,2,3,4,5,6,7,8};
?????? vv2 = new List();
for (int i = 0; i < v2.length; i ++){
vv2.addElement( i+1 ,v2[i] );
}
System.out.println("\n\r\n\r");
for (int i = 1; i <= vv2.getLength(); i++){
System.out.print( vv2.getElement(i) + " " );
}
System.out.println("\n\r\n\r");
System.out.println("Summa V1+V2 => V1 :");


VectorMath.getSum(vv1, vv2);

System.out.println("\n\r\n\r");
for (int i = 1; i <= vv1.getLength(); i++){
System.out.print( vv1.getElement(i) + " " );
}

}
 
S

skysun

#2
На счет VectorMath, если я все понял правильно, тип параметров должен быть Vectorable.
Для класса теста если надо тестировать функционал описанный в Vectorable то и пиши Vectorable.
 
J

jCoder

#3
Значит смотри, ситуция следующая, твой интерфейс Vectorable, может выступать только в качестве ссылочного типа. Это означает, что ты можешь в своей программе объявить переменную (в том числе и параметры метода), этого типа(Vectorable). Но на прямую, объекты подобного типа, создавать нельзя, так как интерфейс является абстрактным, и требует дополнительной инициализации.
Ситуация меняется, когда ты определяешь класс, который реализует этот интерфейс, т.е. реализует его абстрактные методы. В этом случае, в качестве типа переменной(ссылки), можно использовать или имя класса реализующего интерфейс(у тебя таковых два: List и Array) или имя самого интерфейса, ошибки в данном случае никакой не будет, но объект ты создаешь такого класса, который тебе нужен. Таким образом в методе getSum(), класса VectorMath, можно написать так:

public static void getSum(Vectorable v1, Vectorable v2 ){ // или например Array v1, List v2 в
for (int i = 1; i <= v1.getLength(); i++){ // зависимости от того какие
v1.setElement(i, (v1.getElement(i) + v2.getElement(i))); // объекты тебе нужены
}
}

в силу того, что внутри метода вызываются методы, сигнатуры которых описаны в интерфейсе, а сами методы(их тела) определены в одном из классов(Array или List).

И дальше "кусочек тестирующего класса", там где ????, определяешь:

Vectorable vv1 = new Array(); // или Array vv1 = new Array();

...

Vectorable vv2 = new List(); // или List vv2 = new List();

К слову не рекомендуется давать имена своим классам, совпадающими с именами классов API Java (это касается класса Array, да и List пожалуй тоже, так как этот интерфейс входит в пакет коллекционных классов Java). В противном случае, тебе придётся обращаться к "своим" по их полным именам (включая имена пакетов), это как минимум не удобно, а как максимум можно просто запутаться, лучше всего просто комбинировать имена, к примеру MyArray, CollectArray или там NewArray.

И ещё..., имена пакетов должны начинаться с маленькой буквы, и далее могут содержать заглавные, это принятое соглашение в Java которого лучше придерживаться, за редким исключением пакеты именуются с заглавной буквы:

package codersys.Vector // лучше package codersys.vector

По большому счету, если ты действительно хочешь разобрать со связанными списками, векторами, динамическими массивами, обратись к коллекциям Java, а именно к пакету java.util (точнее к той его части, которая касается коллекций), там ты найдешь все необходимое!;)