Влияние добавления членов в абстрактный базовый класс в Java - PullRequest
1 голос
/ 22 февраля 2012

Я новичок в Java, поэтому приведенный ниже вопрос может выглядеть тривиально.

Справочная информация:

Сценарий 1:
У меня есть абстрактный базовый классC1 в Java с, скажем, N функциями-членами интерфейса.
Клиент использует этот класс в качестве пакета и реализует Client1 бизнес-логику клиента.
То есть Client1, используя пакет Package1 (которыйсодержит C1 определение класса) умеет работать с jar JAR1.

Сценарий 2:
Я хочу понять влияние добавления новых функций-членов в класс C1.Класс C1 с дополнительными членами (скажем, мы называем C2) содержит N+M функции-члена (которые предполагают, что клиент не использует) имеет файл jar JAR2.

Теперь может существовать несколько комбинаций развертывания -
Client1 (построен на Package1) работает в среде JAR1
Client1 (построен на Package1) работает вокружение JAR2
и т. д.

Я в основном из C ++, и там концепция vptr и ее влияние будут детально изучены при добавлении нового интерфейса в класс, который предоставляется клиентам.,

Вопрос:
a.Как эти расширения должны быть проанализированы и реализованы в случае JAVA (любой материал по этому поводу очень полезен).
b.Если это «безопасный вариант» в java, с какими другими соображениями нам нужно разобраться в такой ситуации.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Чтобы ответить на оба вопроса:

a) В этой статье описывается, как JVM загружает и связывает файлы классов: http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html.

b) Пока сигнатура методов / открытых членов нене меняйте, код вызова все равно будет работать.Их изменение приведет к исключениям времени выполнения при загрузке класса.

1 голос
/ 22 февраля 2012

Если я правильно понял, ваш вопрос касается последствий модификации интерфейса.

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

interface Turns
{
   public void turnLeft();
   public void turnRight();
}

class Device implements Turns
{
   public void turnLeft()
   {
     //implementation
   }
   public void turnRight()
   {
     //implementation
   }
}

Теперь, если нам нужно изменить интерфейс.Что мы делаем, это расширяем интерфейс.

interface TurnsAllWays extends Turns
{
   public void turnsBack();
}

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

...