1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программирован. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление
  2. Чат codeby в telegram перезагрузка. Обсуждаем вопросы информационной безопасности и методы защиты информации, программирование. Задавайте свои вопросы и комментируйте чужие. Подробнее ...

    Скрыть объявление

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

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

  1. systemscoders

    systemscoders Гость

    Репутация:
    0
    Доброго времени суток. Я в программировании на 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) + " " );
    }

    }
     
  2. skysun

    skysun Гость

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

    jCoder Гость

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

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