Реализация общего интерфейса из разных классов Java
Здесь у меня есть метод добавления пользователей в базу данных, основанный на заданных аргументах (имя пользователя, пароль и т. д...)
public boolean addUser(String username, String password,
String f_name, String l_name, String email)
{
try
{
pstmnt = conn.prepareStatement("INSERT INTO users VALUES (user_id_increment.nextval,?,?,?,?)");
//do stuff...
И один здесь, чтобы добавить User объекты к ArrayList
public boolean addUser(User username)
{
if(users.contains(username))
//do stuff...
Однако я пытаюсь реализовать оба случая через общий интерфейс:
public interface Admin_DAO {
public void addUser();
//other methods...
Я не уверен, как я мог бы сделать это так, чтобы оба класса могли реализовать один и тот же интерфейс, учитывая, что они требуют разных аргументов.
Есть идеи?
5 ответов:
Измените свой admin DAO, чтобы принять объект данныхUser , чтобы учесть любые будущие изменения количества аргументов, которые вам нужно передать, не затрагиваяpublic интерфейс.
public interface AdminDAO { public boolean addUser(User user); }Затем реализуйте этот метод как перегрузку в пользовательском DAO. Я также предлагаю хранить или передавать ваши пароли как
char[], чтобы предотвратить интернирование (добавление в пул строк Java).public class UserDAO implements AdminDAO { public boolean addUser(User user) { return addUser (user.getUsername(), user.getPassword(), user.getFName(), user.getLName(), user.getEmail()); } public boolean addUser( String username, char[] password, String f_name, String l_name, String email) { // ... } }EDIT: (расширение интерфейса в respone до Комментарии ОП ниже)
public interface IUser { public boolean addUser(User user); } public interface AdminDAO extends IUser { // other DAO methods } public class UserDAO implements AdminDAO { // ... } public class UserUtil implements IUser { public boolean addUser(User user) { return addUser (user.getUsername(), user.getPassword(), user.getFName(), user.getLName(), user.getEmail()); } public boolean addUser( String username, char[] password, String f_name, String l_name, String email) { // ... } }
Вы не можете реализовать метод интерфейса с несколькими различными сигнатурами.
Теперь, когда я с этим покончил, позвольте мне уточнить. Интерфейс включает сигнатуры методов. Вы не можете реализовать этот интерфейс, изменив сигнатуры метода, потому что это фундаментально меняет то, как Java видит метод. Java считает, что два метода с разными сигнатурами так же различны, как если бы они имели разные имена. Таким образом, вы можете написать класс с двумя различнымиaddUserметоды, но только один из них будет переопределять метод из интерфейса.Если ваши методы требуют совершенно другой информации, они, вероятно, не должны реализовывать один и тот же интерфейс.Однако, если они требуют по существу ту же информацию, но в другом формате, то вы должны написать интерфейс, который принимает общий формат для этой информации, и тогда они оба могут реализовать его. Так, например, если окажется, что A
Userвыглядит в основном как это:Затем вы можете заставить ваш интерфейс принимать объектыpublic User(String username, String password, String f_name, String l_name, String email) { }User.public interface Admin_DAO { public void addUser(User u); }И затем вы можете реализовать это по мере необходимости в ваших различных классах.
Оберните аргументы в интерфейс.
public interface IUser{ String getName(); String getPassword(); //etc }Тогда пусть ваш Admin_DAO принимает IUsers.
public interface Admin_DAO{ void addUser(IUser user); boolean contains(IUser user); }Это позволяет абстрагировать детали реализации Admin_DAO. Это может быть база данных или просто структура данных в памяти. Если он принимает данные, завернутые в интерфейс, вы можете передавать объекты того же типа.
В идеале должно быть два класса. Поскольку информация, используемая для обоих методов, одинакова. Ваш интерфейс должен выглядеть следующим образом:
interface Admin_DAO{ public void addUser(User user); }И вы должны иметь два отдельных класса, реализующих этот интерфейс:
class AddUserToList implements Admin_DAO{ public void addUser(User user){ //add user to list } class addUserToDB implements Admin_DAO{ public void addUser(User user){ //add user to list }Каждый класс должен действительно служить одной цели.
Короткий ответ Вы не можете. Вот несколько моих любимых абзацев из книги GoF Design Patterns. Текст ниже должен очистить любой запрос, который у вас есть. Возможно, вы захотите прочитать его пару раз.
Каждая операция, объявленная объектом, задает имя операции, объекты, которые он принимает в качестве параметров, и возврат операции значение.Это называется сигнатурой операции.Набор всего сигнатуры, определяемые операциями объекта, называются интерфейсом к объекту. Интерфейс объекта характеризует полный набор запросы, которые могут быть отправлены объекту. Любой запрос, который соответствует a подпись в интерфейсе объекта может быть отправлена объекту.
Тип-это имя, используемое для обозначения определенного интерфейса. Мы говорим об объект как имеющий тип "окно", если он принимает все запросы на операции, определенные в интерфейсе с именем " окно."Объект может имеют много типов, и широко различные объекты могут делиться тип.Часть интерфейс объекта может быть охарактеризован как одним типом, так и другим. части по другим типам.Два объекта одного типа нуждаются только в совместном использовании части их интерфейсов. Интерфейсы могут содержать другие интерфейсы как подмножества. Мы говорим, что тип является подтипом другого, если его интерфейс содержит интерфейс своего супертипа. Часто мы говорим о подтипе наследование интерфейса своего супертипа.
Интерфейсы являются фундаментальными в объектно-ориентированных системах. Объекты являются известны только через их интерфейсы.Нет никакого способа узнать что-либо. об объекте или попросить его сделать что-нибудь, не проходя через его взаимодействие. Интерфейс объекта ничего не говорит о его реализация-различные объекты могут свободно реализовывать запросы. иначе.
Comments