Почему я должен использовать интерфейс в этой ситуации в Java? - PullRequest
1 голос
/ 01 марта 2011

Я пытаюсь понять основы концепций ООП Java, поэтому у меня есть вопрос об интерфейсах, так как это немного смущает меня.Ниже я играл с двумя классами.Один, который реализует интерфейс SizeComparable , а другой - нет, но тоже работает.

public interface SizeComparable {
    int isHigher(SizeComparable obj);
}

public class Interesting implements SizeComparable {

    private int height;

    public Interesting(int height) {
        this.height = height;
    }

    public int getHeight() {
        return height;
    }

    public int isHigher(SizeComparable obj) {
        Interesting otherInteresting = (Interesting)obj;
        if(this.getHeight() > otherInteresting.getHeight()) {
            return 1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        Interesting i1 = new Interesting(182);
        Interesting i2 = new Interesting(69);

        int result = i1.isHigher(i2);

        System.out.println("Is i1 higher than i2? Result: " + result);
    }

}

Чем код выше, чем код ниже?Лично я не понимаю, потому что код ниже тех, что это отличная работа.Мне не хватает некоторых концепций, лежащих в основе идеи интерфейса?

public class Interesting {

    private int height;

    public Interesting(int height) {
        this.height = height;
    }

    public int getHeight() {
        return height;
    }

    public int isHigher(Interesting obj) {
        if(this.getHeight() > obj.getHeight()) {
            return 1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        Interesting i1 = new Interesting(182);
        Interesting i2 = new Interesting(69);

        int result = i1.isHigher(i2);

        System.out.println("Is i1 higher than i2? Result: " + result);
    }

}

Я пытался это понять ( здесь ), но я все еще не уверен в этом.Извините, если вопрос немного глупый, я просто хочу понять его полностью.

Ответы [ 4 ]

7 голосов
/ 01 марта 2011

Если у вас есть классы Interesting, Boring, Indifferent и Crazy, которые представляют некоторые объекты, сопоставимые по высоте, то все они могут реализовать интерфейс SizeComparable и, таким образом, быть сопоставимыми друг с другом.

Без интерфейса вам потребовалось бы n методов в каждом классе, чтобы сравнить его с собой и всеми остальными.

1 голос
/ 01 марта 2011

Если вы хотите, чтобы ваши объекты SizeComparable сравнивались не со всеми другими объектами SizeComparable, а только с объектами некоторого типа, вы можете использовать универсальные типы.

interface SizeComparable<X> {

    /**
     * returns true if this object is higher than that object.
     */
    boolean isHigher(X that);

}

Тогда вы можете создать свои реализации следующим образом:

public class Interesting implements SizeComparable<Interesting> {

    ...

    public boolean isHigher(Interesting obj) {
        return this.getHeight() > obj.getHeight();
    }

}

Или вы могли бы даже иметь другой интерфейс

public interface HeigthHaving extends SizeComparable<HeightHaving> {

    /**
     * returns the height of this object.
     */
    public int getHeigth(); 


    /**
     * compares this object's height with another objects height.
     * @return true if this.getHeight() > that.getHeight, else false.
     */
    public boolean isHigher(HeightHaving that);

}

Теперь каждая реализация HeightHaving должна реализовывать метод isHigher(HeightHaving) (это было бы так, даже если бы мы не повторяли его здесь), и должна делать это в соответствии с приведенной здесь спецификацией. Однако на другие реализации SizeComparable это не влияет.

Хорошая вещь здесь в том, что теперь, например, алгоритмы сортировки могут сортировать списки / массивы любого типа X, реализующие SizeComparable, так что вам не нужно записывать его снова для каждого нового типа объекта, который вы можете отсортировать по высоте.

(На самом деле, в стандартном API уже есть подобный интерфейс Comparable<X>. Возможно, вы захотите использовать его вместо SizeComparable.)

Кстати, для isXXX метода обычно логический тип возвращаемого значения является более разумным, чем целое число.

1 голос
/ 01 марта 2011

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

public interface HeightCapable {
    int getHeight();
}

public class Interesting implements HeightCapable {

    private int height;

    public Interesting(int height) {
        this.height = height;
    }

    public int getHeight() {
        return height;
    }

}

public class SomeOtherClass {
    public boolean isHigher(HeightCapable obj1, HeightCapable obj2) {
        // ... do something interesting
        if (obj1.getHeight() > obj2.getHeight()) {
            return true;
        }
}

В приведенном выше примере любой класс, реализующий интерфейс HeightCapable , может вызвать SomeOtherClass.isHigher () . Без интерфейса любой класс, желающий вызвать SomeOtherClass.isHigher (), должен был бы наследовать от общего класса. В Java отсутствует множественное наследование.

1 голос
/ 01 марта 2011

В начале это, вероятно, не будет иметь особого смысла, однако, когда вы начнете внедрять зависимости, начнете тестирование или напишете более одной реализации интерфейса, чем это действительно даст вам импульс.

Также допускается множественное наследование. Иногда вы хотите что-то похожее - очень общий интерфейс, который может использоваться многими классами в вашей системе. Это придет с большими системами и большими иерархиями классов.

Прямо сейчас просто доверьтесь остальному миру java и используйте их интерфейсы:)

и удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...