Наследование Java - добавленные методы - PullRequest
0 голосов
/ 25 марта 2009

Я хочу иметь базовый класс BaseConnect, который содержит OutputStream и дочерние классы ObjectStreamConnect и DataStreamConnect. В моем классе BaseConnect у меня есть OutputStream os;, а в моих классах Two child у меня есть конструкторы, которые делают "os = ObjectOutputStream(...)" или "os = DataOutputStream(...)" соответственно.

Поскольку ObjectOutputStream s имеют метод writeObject(Object o), а DataOutputStreams - нет, кажется, что мой класс ObjectStreamConnect не может сделать "os.writeObject(object)", поскольку родительский класс OutputStream не имеет иметь writeObject(Object o).

Я уверен, что это вонючий код, и мне интересно, как с этим справиться.

Мои мысли:

Я думал о том, чтобы сделать метод, содержащий os.writeObject абстрактный, так, чтобы ObjectStreamConnect мог реализовать его по-другому, но потом я понял, что DataStreamConnect также должен будет реализовать его, в чем он не нуждается.

Я также не хочу просто избавляться от родителя, и два класса реализуют все по отдельности, потому что у них есть много одинаковых методов с одинаковыми реализациями.

Пожалуйста, помогите. Почему-то ответ на эту проблему мне не приходит.

JBU

edit: я не могу вставить весь код, но он выглядит примерно так:

public class BaseConnect {
  OutputStream os;
   ...
}

public class ObjectStreamConnect extends BaseConnect {
  public ObjectStreamConnect () {
    ...
    os = new ObjectOutputStream(socket.getOutputStream);
  }

  public void writeObject(Object o) {
    os.writeObject(o);
  }
}

public class DataStreamConnect extends BaseConnect {
  public DataStreamConnect () {
    ...
    os = new DataOutputStream(socket.getOutputStream);
  }
}

Ответы [ 5 ]

4 голосов
/ 25 марта 2009

Вы, похоже, говорите: "Мои два объекта используют несколько общих методов, и я делюсь ими через наследование суперкласса".

Тогда вы застреваете, потому что наследование на самом деле говорит, что «этот является одним из них, и поэтому имеет этот API», когда это не так, как предлагает ваш сложный для реализации метод.

Если вы поместите общие методы в некоторый класс помощника и предоставите DataStreamConnect и OutputStreamConnect экземпляр помощника, вы можете поделиться кодом поддержки без необходимости использовать один и тот же API.

1 голос
/ 25 марта 2009

Если вы используете Java 1.5 или выше, вы можете использовать универсальный класс:

public class Base<T extends OutputStream>{
    T os;
...
}

public class OutputStreamConnect extends Base<ObjectOutputStream>

    public OutputStreamConnet(){
        os = new ObjectOutputStream();
    }

    public void doWrite(Object o){
        os.writeObject(o);
    }
}
0 голосов
/ 25 марта 2009

Если я правильно понимаю проблему, у вас должен быть класс BaseConnect , объявленный как абстрактный с общим поведением, инкапсулированным в нем. Проблемный метод writeObject также должен быть объявлен как абстрактный, и вы должны оставить его до конкретной реализации в подклассе, как он управляет желаемой целью.

Затем в ObjectStreamConnect вы можете проверить тип потока с помощью оператора instanceof , затем преобразовать объект в ObjectOutputStream и затем вы можете использовать os.writeObject (o) без проблем.

В DataStreamConnect вы должны реализовать этот метод другим способом.

Я имею в виду что-то вроде этого:

public abstract class BaseConnect {
  protected OutputStream os;
   ...
  public abstract void writeObject(Object o);

  // common behavior implemented in this class
}

public class ObjectStreamConnect extends BaseConnect {
  public ObjectStreamConnect () {
    ...
    os = new ObjectOutputStream(socket.getOutputStream);
  }

  public void writeObject(Object o) {
    if (os instanceof ObjectOutputStream) {
      ((ObjectOutputStream) os).writeObject(o);
    } else {
      // throw some exception here or something, because this should not happen
    }
  }
}

public class DataStreamConnect extends BaseConnect {
  public DataStreamConnect () {
    ...
    os = new DataOutputStream(socket.getOutputStream);
  }

  public void writeObject(Object o) {
    // implement writing of the object in another way here
  }
}

Возможно, вам также следует переименовать BaseConnect в AbstractConnect, но это зависит от ваших соглашений кода.

0 голосов
/ 25 марта 2009

Вы должны использовать интерфейс для объявления общих жизненно важных методов двух классов. Вы не должны заботиться о будущей суб-реализации в базовом классе - это против ОО-закона! Или вы просто хотите базовый класс, чтобы вам не приходилось писать дубликаты кода? Используйте интерфейс и вспомогательный класс, как предложил ДанВинтон.

0 голосов
/ 25 марта 2009

Можете ли вы иметь только один абстрактный метод для OutputStream

write(Object o)

(я предполагаю, что вы можете «писать» в оба подкласса), и оба подкласса реализуют это по-своему?

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