Пакет 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 год, и в этом случае он работал.
В соответствии с этой статьей вы получаете доступ к методу по умолчанию в интерфейсе 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 .
Этот ответ написан главным образом для пользователей, которые исходят из вопроса 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!
blockquote>
Вам не нужно переопределять метод по умолчанию для интерфейса. Просто назовите его следующим:
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
blockquote>