Abstract Interfaces, abstract methods in interfaces.

Модератор: Absurd

Ответить
Chester
Сообщения: 60
Зарегистрирован: 06 дек 2004, 10:46
Откуда: Kyiv, Ukraine
Контактная информация:

Господа, просветите, зачем применяется обьявление абстрактных (abstract) интерфейсов, а также абстрактных методов в интерфейсах?
К примеру вот таку штукецию я увидел здесь:

public abstract interface net.sf.jasperreports.engine.JRDataSourceProvider extends java.lang.Object {
...
public abstract boolean supprtsGetsFieldsOperation();
...
public abstract void dispose(JRDataSource arg) throws net.sf.jasperreports.engine.JRException;
}
... She gave me something, it was a mushroom...
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Chester, не могу быть увереным на 100%, но мне кажется, что моя мысль правильная.

Использование "abstract" в данном случае ничего не меняет!
Интерфейс является и так уже абстрактным классом.

Таким образом, будет там написано просто "interface", или "abstract interface" - это не имеет значения.
Результат будет один и тот же.

Накидал тут примерчик:

Код: Выделить всё

public abstract interface AbstractInterface {
	public abstract void test();
}

Код: Выделить всё

public interface AbstractInterface2 {
	public void test();
}

Код: Выделить всё

public class ClassA implements AbstractInterface {
	public void test() {
		System.out.println("ClassA");
	}
}

Код: Выделить всё

public class ClassB implements AbstractInterface {
	public void test() {
		System.out.println("ClassB");
	}
}

Код: Выделить всё

public class ClassA2 implements AbstractInterface2 {
	public void test() {
		System.out.println("ClassA2");
	}
}

Код: Выделить всё

public class ClassB2 implements AbstractInterface2 {
	public void test() {
		System.out.println("ClassB2");
	}
}

Код: Выделить всё

public class TestInterfaces {
	public static void main(String[] args) {
		AbstractInterface a = new ClassA();
		AbstractInterface b = new ClassB();
		AbstractInterface2 a2 = new ClassA2();
		AbstractInterface2 b2 = new ClassB2();
		
		a.test();
		b.test();
		a2.test();
		b2.test();
	}
}
Работает абсолютно идентично.
Понимаю, что это не доказательство, но просто, как пример.

Скорей всего применение оборота "abstract interface" - это излишняя перестраховка, а может быть, просто привычка из другого языка (Точно не знаю, но, возможно, в Си нужно обязательно писать "abstract" в таких случаях).

P.S. Если же вопрос в том, зачем вообще применять интерфейсы - то это совсем другой разговор :-)
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

9.1.1.1 abstract Interfaces
Every interface is implicitly abstract. This modifier is obsolete and should not be used in new programs.
...
9.4 Abstract Method Declarations

Every method declaration in the body of an interface is implicitly abstract, so its body is always represented by a semicolon, not a block.
...
For compatibility with older versions of the Java platform, it is permitted but discouraged, as a matter of style, to redundantly specify the abstract modifier for methods declared in interfaces.

http://java.sun.com/docs/books/jls/seco ... s.doc.html
Даже самый дурацкий замысел можно воплотить мастерски
Chester
Сообщения: 60
Зарегистрирован: 06 дек 2004, 10:46
Откуда: Kyiv, Ukraine
Контактная информация:

Хм..... однако, еще не все потеряно, а то глядя на такую конструкцию призадамулася об уровне знаний Java Core.

Благодарю!
... She gave me something, it was a mushroom...
Ответить