Dostęp do składnika Interfejsu

0

Witam,

Mam interfejs Figura, ktory zawiera klasę wewnętrzną Krawędź oraz listę elementów klasy. W pochodnej klasie Trójkąt chciałbym po stworzeniu tego obiektu obliczyć kąty jakie są pomiędzy krawędziami oraz wstawić te dane do listy krawędzi, która jest zadeklarowana w interfejsie.

Jak uzyskać dostęp do "krawedzie" z klasy Trojkat?

Będę wdzięczny za pomoc.

public  interface Figura {
	
	class Krawedz{
		int dlugosc;
		int kat;
		Krawedz(int d, int k){
			this.dlugosc=d;
			this.kat=k;
		}
		public ArrayList<Krawedz> krawedzie=new ArrayList<Krawedz>(); 
		
		
	}
public class Trojkat implements Figura{
public int krawedz1, krawedz2, krawedz3;
	
	public Trojkat(int k1, int k2, k3){
            this.krawedz1=k1;
            this.krawedz2=k2;
            this.krawedz3=k3;

	}

	
}
0

Ogólnie to myślę, że deklarowanie tablicy w interfejsie jest błedem, bo interfejs z założenia ma byc dopiero zaimplementowany. Tak samo tworzenie klasy wewnatrz interfejsu, po co? Ja bym ja wyrzucił jako standardową klase.

Jakbyś chciał rozwiązanie do tego co pytasz to wg mnie wyglada mniej-wiecej tak:

public class Trojkat implements Figura{
    public int krawedz1, krawedz2, krawedz3;

    public Trojkat(int k1, int k2, int k3){
        this.krawedz1=k1;
        this.krawedz2=k2;
        this.krawedz3=k3;
    }

    public void dostepDoFigura(){
        Figura.Krawedz.COS_ROBIACA_METODA();
        Figura.krawedzie.add(new Krawedz(1,1));
    }
}


public interface Figura {

    public static class Krawedz {
        int dlugosc;
        int kat;

        Krawedz(int d, int k) {
            this.dlugosc = d;
            this.kat = k;
        }

        public static void COS_ROBIACA_METODA(){
            System.out.println("robie cos");
        }
    }

    public ArrayList<Krawedz> krawedzie = new ArrayList<Krawedz>();
}

klasa w interfejsie musi byc publiczna -bo taki chcesz miec dostep, statyczna - bo nie tworzysz jej instancji tylko odwolujesz sie do klasy.
Potem odwołujesz sie jak do każdej statycznej klasy: Figura.Krawedzie.METODY_I_POLA_PUBLICZNE
Lista tak samo, możesz sie do niej odwołać przez Figura.nazwa_listy, ale mysle ze to jest błąd.

Spróbuj to przepisac na nowo bardziej "po bożemu" i wklejaj tutaj

0

W klasie która implementuje interface Figura robisz tylko:

Krawedz nowy = new Krawedz(1,2);

Zresztą... to bez sensu - zrobiłeś interface który ma w sobie tylko klase statyczną która - to jest to miejsce które powinno zostać wydzielone jak oddzielna klasa ew. powinna zostać klasą wewnętrzną klasy której się naprawdę przydaje - bo o to w tym mechanizmie chodzi.

EDIT: jeżeli dobrze (teraz) zrozumiałem to chcesz przez klase potem inteface dostać się do pól tamtej klasy ? jeżeli tak to usuń to wszystko i napisz od nowa.

0

Na szybko napisałem to, nie wg interfejsów a wg klasy abstrakcyjej po ktorej beda dziedziczyc odpowiednie figury
Klasa wykonawcza:

public class App
{
    public static void main( String[] args )
    {
        List<Krawedz> list = new ArrayList<Krawedz>(3);
        list.add(new Krawedz(1,1));
        list.add(new Krawedz(2,2));
        list.add(new Krawedz(3,3));

        Figura trojkat = new Trojkat(list);
        trojkat.przetwarzajKrawedzie();
    }
}
public abstract class Figura {
    public List<Krawedz> krawedzList;

    public abstract void przetwarzajKrawedzie();
}
public class Trojkat extends Figura {

    public Trojkat(List<Krawedz> krawedzList) {
        this.krawedzList = krawedzList;
    }

    public void przetwarzajKrawedzie(){
        Iterator iterator = krawedzList.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next().toString());
        }
    }
}
package com.maciej;

public class Krawedz {
    public int dlugosc;
    public int kat;

    public Krawedz(int dlugosc, int kat) {
        this.dlugosc = dlugosc;
        this.kat = kat;
    }

    @Override
    public String toString() {
        return "Krawedz{" +
                "dlugosc=" + dlugosc +
                ", kat=" + kat +
                '}';
    }
}

Wiec tak, nie wiem jakich pól oczekujesz od klasy Krawedz, ale swobodnie mozesz sobie je tam ustawiac na takie jak ci odpowiadaja. Ja dałem takie jak ty dałeś wczesniej :P
Klasa abstrakcyjna Figura ma 2 cechy: 1.liste krawedzi 2.metode która przetwarza krawedzie w jakis sposob (to tez jakas wymyslona metoda, rownie dobrze moze ona liczyc kąty, które chcesz policzyć)

Trojkat dziedziczy po Figurze, wiec ma jej cechy. Konstruktor Trojkat'a ma parametr liste Krawedzi. Wg mnie fajny sposob, bo po samym rozmiarze listy mozesz powiedziec co to za figura (jesli to potrzebne). (może by tu zamiast listy dac po prostu tablice.. teraz pomyslalem)

Przykladowa implementacja przetwarzajFigure robi w moim przypadku tyle, co tworzenie iteratora z listy krawedzi i wypisanie ich na konsole.

konsola:

Krawedz{dlugosc=1, kat=1}
Krawedz{dlugosc=2, kat=2}
Krawedz{dlugosc=3, kat=3}

Process finished with exit code 0

Mozesz też zrobic coś podobnego ale interfejs-style i pokazać jak ci wyszlo :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1