2016-04-12 3 views
0

Вот мой класс:Trouble отливки интерфейса реализованного класса

public class LinkedListSet implements Set { 
    private class Node //much easier as a private class; don't have to extend 
    { 
     private int data; 
     private Node next; 
     public Node(){} 
     public Node (int x) 
     { 
      data = x; 
     } 

     public int data() 
     { 
      return data; 
     } 

     public Node next() 
     { 
     return next; 
     } 

    } 

    private Node first; 
    private int Size; 
    private int whichList; //used to identify the particular LL object 

Вот мой интерфейс:

public interface Set { 
    public boolean isEmpty();    
    public void makeEmpty();    
    public boolean isMember(int x); 
    public void add(int x);  
    public void remove(int y);    
    public void union(Set other, Set result); 
    public void intersection (Set other, Set result); 
    public void difference (Set other, Set result); 
    @Override 
    public String toString(); 

    @Override 
    public boolean equals(Object other); 

    public void setList(int i); //i added this to use it as an identifier for each 
          //list element in the set array 

    public String getListId(); //these two extra methods make life easier 

} 

У меня есть метод, как это (в LinkedListSet классе):

public void difference (Set other, Set result) 
{ 
    if (other.isEmpty()) 
    { 
     System.out.println("The set is empty before cast"); 
    } 
    LinkedListSet othr = (LinkedListSet) other; 
    LinkedListSet res = (LinkedListSet) result; 
    if (this.isEmpty() || othr.isEmpty()) 
    { 
     if (othr.isEmpty()) 
      System.out.println("The set is empty after cast"); 
     if (this.isEmpty()) 
      System.out.println("This is also empty"); 
     return; 
    } 
    differenceHelper(this.first, othr.first, res); 
    result = res; 
}// the print statements were added for debugging 

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

Однако все переменные экземпляра: null. Список пуст до и после того, как я его брошу (когда он фактически не пуст). Я знаю, это потому, что интерфейс не содержит никакой информации о Nodes, но есть ли что-нибудь, что я могу сделать, кроме редактирования интерфейса, чтобы включить Node?

Надеюсь, я сделал это достаточно ясно. Любая помощь будет оценена по достоинству.

Редактировать: В основной программе я создал массив наборов.

Set[] sets = new Set[7]; 
    for (int i = 0; i< sets.length; i++) //initialize each element 
    { 
     sets[i] = new LinkedListSet(); 
    } 

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

тогда я называю разностный метод.

 sets[0].difference(sets[1], sets[4]) 

sets [1] .isEmpty возвращает true по какой-либо причине (хотя это не так).

Если бы я сделал что-то вроде: System.out.println (устанавливает [1] .first.data()) У меня не было бы проблем вообще. По какой-то причине все значения становятся нулевыми, когда параметры передаются методу разности.

public boolean isEmpty() 
{ 
    return first == null; 
} 
+0

Пожалуйста, добавьте код реализации разностного метода LinkListSet. Также код, в котором вы создаете экземпляр и используете эти классы. Может быть, вы делаете что-то не так. – Mustafa

+0

Это неверный код реализации. –

+0

Проблема заключается в методе. Я проверил. –

ответ

0

Я испытал то, что вы пытаетесь сделать с помощью следующего кода, и я не вижу никаких проблем:

import org.junit.Test; 

public class RandomCastTest { 

    public interface Set { 
     boolean isEmpty(); 

     void add(int x); 

     void difference(Set other, Set result); 

     @Override 
     String toString(); 

     @Override 
     boolean equals(Object other); 
    } 

    public class LinkedListSet implements Set { 
     private class Node //much easier as a private class; don't have to extend 
     { 
      private int data; 
      private Node next; 

      public Node() { 
      } 

      public Node(int x) { 
       data = x; 
      } 

      public int data() { 
       return data; 
      } 

      public Node next() { 
       return next; 
      } 

      public void next(Node node) { 
       next = node; 
      } 
     } 

     private Node first; 
     private int Size; 
     private int whichList; //used to identify the particular LL object 

     @Override 
     public boolean isEmpty() { 
      return first == null; 
     } 

     @Override 
     public void add(int x) { 
      Node node = new Node(x); 

      if (first == null) { 
       first = node; 
      } else { 
       Node currentNode; 
       Node nextNode = first; 
       do { 
        currentNode = nextNode; 
        nextNode = currentNode.next(); 
       } while (nextNode != null); 

       currentNode.next(node); 
      } 
      Size++; 
     } 

     @Override 
     public void difference(Set other, Set result) { 
      if (other.isEmpty()) { 
       System.out.println("The set is empty before cast"); 
      } 
      LinkedListSet othr = (LinkedListSet) other; 
      LinkedListSet res = (LinkedListSet) result; 
      if (this.isEmpty() || othr.isEmpty()) { 
       if (othr.isEmpty()) 
        System.out.println("The set is empty after cast"); 
       if (this.isEmpty()) 
        System.out.println("This is also empty"); 
       return; 
      } 
      result = res; 
     } 
    } 

    @Test 
    public void test() { 
     Set[] sets = new Set[7]; 
     for (int i = 0; i < sets.length; i++) { 
      sets[i] = new LinkedListSet(); 
     } 

     for (int i = 0; i < 5; i++) { 
      sets[1].add(i); 
     } 

     for (int i = 5; i < 10; i++) { 
      sets[0].add(i); 
     } 

     sets[0].difference(sets[1], sets[4]); 
     // ... find difference 
    } 
} 

Для упрощения я удалил нереализованные методы из интерфейса. Также добавлена ​​реализация метода add. Посмотрите, работает ли это для вас.

+0

Спасибо, я ценю вашу помощь. Я нашел проблему :) –

+0

Приветствую вас. Спасибо за точки SO;). так в чем была проблема? – Mustafa

Смежные вопросы