Какая разница между наследованием и делегированием в java

Возможный дубликат:
Предпочитаете композицию над наследованием?

В чем разница между наследованием и делегированием в java?

Как использовать следующий пример в моем проекте? Пожалуйста, вы можете вести меня с делегацией. Я знаю о наследовании, но не знаю много информации о делегировании. Поэтому, пожалуйста, укажите правильную причину. Почему я должен использовать это?

 package com.m;

 class RealPrinter { // the "delegate"
     void print() { 
      System.out.println("something"); 
    }
 }

 class Printer { // the "delegator"
     RealPrinter p = new RealPrinter(); // create the delegate 
     void print() { 
     p.print(); // delegation
     } 
 }

 public class Tester {

// to the outside world it looks like Printer actually prints.
     public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
     }

   }

Ответ 1

Когда вы делегируете, вы просто вызываете какой-то класс, который знает, что нужно делать. Вам все равно, как это делается, все, о чем вы заботитесь, это то, что класс, который вы называете, знает, что нужно делать.

Если бы я был вами, хотя я бы сделал интерфейс и назову его IPrinter (или что-то вроде этих строк), у которого есть один метод с именем print. Я бы тогда сделал RealPrinter реализовать этот интерфейс. Наконец, я бы изменил эту строку: RealPrinter p = new RealPrinter();: IPrinter p = new RealPrinter().

Так как RealPrinter реализует IPrinter, то я точно знаю, что он имеет метод print. Затем я смогу использовать этот метод для изменения поведения печати моего приложения, делегируя его соответствующему классу.

Это обычно обеспечивает большую гибкость, поскольку вы не встраиваете поведение в свой класс, а скорее оставляете его в другом классе.

В этом случае, чтобы изменить поведение вашего приложения в отношении печати, вам просто нужно создать другой класс, который реализует IPrinter, а затем измените эту строку: IPrinter p = new RealPrinter(); на IPrinter p = new MyOtherPrinter();.

Ответ 2

Inheritence использует систему java-компилятора для неявного включения кода из другого места, при делегировании вы явно реализуете выноску.

Наследование ограничено одним родительским классом (и предками), но иногда это может быть неочевидно, когда ваш код идет; делегирование менее изящно, но вы можете задействовать функциональность из нескольких других классов, и поток отчетливо заметен.

Что касается вызова внешних функций, то делегирование обычно предпочтительнее именно по этой причине, наследование должно быть зарезервировано для случаев, когда вы хотите реализовать класс, поведение которого конкретно похоже на базовый класс, поэтому его можно по существу обрабатывать как экземпляр базового слоя другим кодом (т.е. он является полиморфным).