Java: наследство - PullRequest
       15

Java: наследство

2 голосов
/ 26 января 2010

Какие есть альтернативы наследованию?

Ответы [ 7 ]

10 голосов
/ 26 января 2010

Эффективная Java: предпочитайте композицию наследованию. (Это на самом деле также и от Банды Четырех).

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

Вместо этого держите ссылку на класс, который вы бы иначе расширили, и делегируйте ему.

Вот ссылка на интервью с Эрихом Гаммой, где он немного говорит о концепции.

2 голосов
/ 15 февраля 2010

Делегирование является альтернативой наследование .

2 голосов
/ 26 января 2010

Я понимаю, что это не Java как таковая , но Scala (язык, работающий на виртуальной машине Java) разрешает mixins (в Scala, называемых traits ) ).

Миксины позволяют использовать некоторые функции вместе с существующим классом, а не внутри дерева наследования.

Когда класс включает в себя миксин, класс реализует интерфейс и включает, а не наследует, все Атрибуты и методы миксина. Они становятся частью класса во время сборник

2 голосов
/ 26 января 2010

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

Реализация интерфейсов является распространенным и часто используемым вариантом. Так, например, если у вас есть класс источника данных, который взаимодействует с СУБД, а не наследует этот класс и использует его для реализации источника данных NoSQL, оба могут реализовать один и тот же интерфейс.

Вместо ..

public class RDBMSDataSource {

  ...

  public String loadSomeDataFromDataSource() {
    ...Do some stuff...
  }
}

public class NoSQLDataSource extends RDBMSDataSource {

   ...

   @Override
   public String loadSomeDataFromDataSource() {
      ...Do some other stuff...
   }
}

public class DataSourceClient {

   public void foo() {
      RDBMSDataSource ds = new NoSQLDataSource();
      ds.loadSomeDataFromDataSource();
   }
}

Что работает, но трудно читать, вы можете использовать это ...

public interface DataSource {
   public String loadSomeDataFromDataSource();
}

public class RDBMSDataSource implements DataSource {

  ...

  public String loadSomeDataFromDataSource() {
    ...Do some stuff...
  }
}

public class NoSQLDataSource implements DataSource {

   ...

   @Override
   public String loadSomeDataFromDataSource() {
      ...Do some other stuff...
   }
}

public class DataSourceClient {

   public void foo() {
      DataSource ds = new NoSQLDataSource();
      ds.loadSomeDataFromDataSource();
   }
}

Другим вариантом будет композиция. Скажем, у вас есть сотрудники и клиенты. Ваши два варианта будут ...

public class Person {

   protected String name;
   protected String address;
   ...More stuff...
}

public class Employee extends Person {

   protected String jobCode;
   protected String department;
   ...More stuff...
}

public class Customer extends Person {

   protected String salesPerson;
   protected Date registrationDate;
   ...More stuff...
}

... или ...

public class ContactInfo {
   private String name;
   private String address;
   ...More stuff...
}

public class Employee {

   private ContactInfo contactInfo;
   private String jobCode;
   private String department;
   ...More stuff...
}

public class Customer {

   private ContactInfo contactInfo;
   private String salesPerson;
   private Date registrationDate;
   ...More stuff...
}

Поскольку Java не имеет множественного наследования, и вы можете реализовать несколько интерфейсов, иногда вам нужно выполнить вышеизложенное, чтобы убедиться, что ваша разработка чиста и читаема.

1 голос
/ 28 ноября 2012

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

0 голосов
/ 06 декабря 2016

Попробуйте делегирование, которое также известно как композиция

Также найдена новая альтернатива как mixin

Миксины - это составные абстрактные классы. Они используются в контексте множественного наследования для добавления служб в класс. Мульти-наследование используется для составления вашего класса с таким количеством миксинов, сколько вы хотите. Например, если у вас есть класс для представления домов, вы можете создать свой дом из этого класса и расширить его, наследуя от таких классов, как Garage и Garden. Вот этот пример, написанный на Scala:

val myHouse = новый дом с гаражом с садом

Вы получите больше информации о mixin https://kerflyn.wordpress.com/2012/07/09/java-8-now-you-have-mixins/

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