что такое classname.super.method означает? [Дубликат]

Пакет Visual Studio NuGet необходимо обновить для новой версии набора инструментов

У меня просто возникла проблема с подключением libpng с Visual Studio 2013. Проблема в том, что в файле пакета были только библиотеки для Visual Studio 2010 и 2012.

Правильное решение - надеяться, что разработчик выпустит обновленный пакет и затем обновит его, но он работал для меня, взломав дополнительную настройку для VS2013, указав на файлы библиотеки VS2012.

Я отредактировал пакет (в папке packages внутри каталога решения), найдя packagename\build\native\packagename.targets и внутри этого файла, скопировав все секции v110. Я изменил v110 на v120 в полях условий только очень осторожно, чтобы пути с именами файлов были все как v110. Это просто позволило Visual Studio 2013 подключиться к библиотекам на 2012 год, и в этом случае он работал.

160
задан Richard Tingle 14 November 2013 в 14:13
поделиться

3 ответа

В соответствии с этой статьей вы получаете доступ к методу по умолчанию в интерфейсе A, используя

A.super.foo();

. Его можно использовать следующим образом (при условии, что интерфейсы A и C

public class ChildClass implements A, C {
    @Override    
    public void foo() {
       //you could completely override the default implementations
       doSomethingElse();
       //or manage conflicts between the same method foo() in both A and C
       A.super.foo();
    }
    public void bah() {
       A.super.foo(); //original foo() from A accessed
       C.super.foo(); //original foo() from C accessed
    }
}

A и C могут оба иметь методы .foo(), и может быть выбрана конкретная реализация по умолчанию, или вы можете использовать один (или оба) как часть вашего нового метода foo(). Вы также можете использовать тот же синтаксис для доступа к версиям по умолчанию в других методах в вашем классе реализации.

Формальное описание синтаксиса вызова метода можно найти в главе главы 15 JLS .

194
ответ дан jihor 1 September 2018 в 02:58
поделиться

Этот ответ написан главным образом для пользователей, которые исходят из вопроса 45047550 , который закрыт.

Интерфейсы Java 8 вводят некоторые аспекты множественного наследования. Методы по умолчанию имеют реализованный элемент функции. Чтобы вызвать метод из суперкласса, вы можете использовать ключевое слово super, но если вы хотите сделать это с помощью суперинтерфейса, его нужно явно указывать.

class Clazz {

    public void foo() {
        System.out.println("Hello Clazz!");
    }

}

interface Interface111 {

    default public void foo() {
        System.out.println("Hello Interface111!");
    }

}

interface Interface222 {

    default public void foo() {
        System.out.println("Hello Interface222!");
    }

}

public class Example extends Clazz implements Interface111, Interface222 {

    public void foo() {
        super.foo(); // (note: Clazz.super is wrong!)
        Interface111.super.foo();
        Interface222.super.foo();
    }

    public static void main(String[] args) {
        new Example().foo();
    }

}

Выход:

Привет, Clazz! Привет, интерфейс111! Hello Interface222!

2
ответ дан Dávid Horváth 1 September 2018 в 02:58
поделиться

Вам не нужно переопределять метод по умолчанию для интерфейса. Просто назовите его следующим:

public class B implements A {

    @Override
    public void foo() {
        System.out.println("B.foo");
    }

    public void afoo() {
        A.super.foo();
    }

    public static void main(String[] args) {
       B b=new B();
       b.afoo();
    }
}

Выход:

A.foo

3
ответ дан Lonely Neuron 1 September 2018 в 02:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: