Полиморфизм является основой объектно-ориентированного программирования. Это означает, что один объект может иметь другой проект. Так как же на объекте может стать другим, это возможно через следующее
- Наследование
- Переопределение / реализация поведения родительского класса
- Привязка объекта времени выполнения
Одним из основных преимуществ этого является реализация переключателя. Допустим, вы кодируете приложение, которое должно общаться с базой данных. И вы случайно определили класс, который выполняет эту операцию с базой данных за вас, и ожидается, что он будет выполнять определенные операции, такие как Add, Delete, Modify. Вы знаете, что база данных может быть реализована разными способами, это может быть взаимодействие с файловой системой или сервером RDBM, таким как MySQL и т. Д. Таким образом, вы, как программист, определите интерфейс, который вы можете использовать, например ...
public interface DBOperation {
public void addEmployee(Employee newEmployee);
public void modifyEmployee(int id, Employee newInfo);
public void deleteEmployee(int id);
}
Теперь у вас может быть несколько реализаций, скажем, у нас есть одна для СУБД, а другая для прямой файловой системы
public class DBOperation_RDBMS implements DBOperation
// implements DBOperation above stating that you intend to implement all
// methods in DBOperation
public void addEmployee(Employee newEmployee) {
// here I would get JDBC (Java's Interface to RDBMS) handle
// add an entry into database table.
}
public void modifyEmployee(int id, Employee newInfo) {
// here I use JDBC handle to modify employee, and id to index to employee
}
public void deleteEmployee(int id) {
// here I would use JDBC handle to delete an entry
}
}
Давайте иметь реализацию базы данных файловой системы
public class DBOperation_FileSystem implements DBOperation
public void addEmployee(Employee newEmployee) {
// here I would Create a file and add a Employee record in to it
}
public void modifyEmployee(int id, Employee newInfo) {
// here I would open file, search for record and change values
}
public void deleteEmployee(int id) {
// here I search entry by id, and delete the record
}
}
Посмотрим, как основной может переключаться между двумя
public class Main {
public static void main(String[] args) throws Exception {
Employee emp = new Employee();
... set employee information
DBOperation dboper = null;
// declare your db operation object, not there is no instance
// associated with it
if(args[0].equals("use_rdbms")) {
dboper = new DBOperation_RDBMS();
// here conditionally, i.e when first argument to program is
// use_rdbms, we instantiate RDBM implementation and associate
// with variable dboper, which delcared as DBOperation.
// this is where runtime binding of polymorphism kicks in
// JVM is allowing this assignment because DBOperation_RDBMS
// has a "is a" relationship with DBOperation.
} else if(args[0].equals("use_fs")) {
dboper = new DBOperation_FileSystem();
// similarly here conditionally we assign a different instance.
} else {
throw new RuntimeException("Dont know which implemnation to use");
}
dboper.addEmployee(emp);
// now dboper is refering to one of the implementation
// based on the if conditions above
// by this point JVM knows dboper variable is associated with
// 'a' implemenation, and it will call appropriate method
}
}
Вы можете использовать концепцию полиморфизма во многих местах, например, в одном примере: вы пишете средство для обработки изображений, и вам необходимо поддерживать целый набор изображений, таких как jpg, tif, png и т. Д. Таким образом, ваше приложение определит интерфейс и работа над ним напрямую. И у вас будет некоторое связывание во время выполнения различных реализаций для каждого из jpg, tif, pgn и т. Д.
Еще одно важное применение, если вы используете java, большую часть времени вы будете работать с интерфейсом List, чтобы вы могли использовать ArrayList сегодня или какой-либо другой интерфейс по мере роста вашего приложения или изменения его потребностей.