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

Тема в разделе "Java", создана пользователем systemscoders, 29 окт 2009.

  1. systemscoders

    systemscoders Гость

    Доброго времени суток. Я в программировании на java начинающий. Есть трудности. Буду рад любым подсказкам...ссылкам , словом любой помощи.
    Есть созданный класс для работы с вектором созданным на основании массива (обработка исключений еще не прописаны) и вектор на основании односвязного списка:
    Код (Text):
    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() {

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

    }
    и

    Код (Text):
    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) {

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

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

    interface Vectorable {

    double getElement(int index);
    void setElement(int index, double value);
    int getLength();
    }
    Есть отдельный класс , который имеет два статических метода для сложения или вычисления скалярного произведения двух векторов. Его нужно записать таким образом, что бы он мог работать со ссылками типа интерфейс, :) ... вот тут то я не могу разобраться. Какого типа должны быть входные параметры..... как нужно работать в тестирующем классе через интерфейс.... свои наброски ...со знаками вопроса я привожу ниже:
    Код (Text):
    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;
    }
    и кусочек тестирующего класса:
    Код (Text):
                ??????????????;

    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) + " " );
    }

    }
     
  2. skysun

    skysun Гость

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

    jCoder Гость

    Значит смотри, ситуция следующая, твой интерфейс 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 (точнее к той его части, которая касается коллекций), там ты найдешь все необходимое!;)
     
Загрузка...

Поделиться этой страницей