我有一个界面和一个班级。
public interface IUser{
public String getFirstname();
public String getLastname();
}
public class User implements Iuser{
String firstname;
String lastname;
public User(String firstname, String lastname)
{
this.firstname = firstname;
this.lastname = lastname;
}
public String getFirstname(){
return firstname;
}
public String getLastname(){
return lastname;
}
}
当我通常需要创建User
的实例时,我会这样做:
User user = new User("Mike", "L");
但我对在互联网上找到的文章感到困惑,因为他们正在创建一个像这样的用户对象的实例:
IUser user = new User("Mike", "L");
我想知道为什么程序员在前面创建一个带有接口的User
实例?
以这种方式创建实例的原因是什么?
为什么您更喜欢IUser user = new User()
而不是User user = new User()
?
答案 0 :(得分:0)
您可以使用不同的对象来实现相同的界面。
底层实现是什么并不重要,重要的是实现IUser
接口的对象具有允许getFirstName
和getLastName
的方法。
这是一个额外的抽象层,使您的代码更简单,更有条理。
答案 1 :(得分:0)
这个想法是该调用之后的代码只知道如何使用该接口。只要界面得到维护,他们就不关心对象的实际情况。可以使用相同接口的许多实现,后续代码也不关心。
只传递实现类(User
),所有后续代码必须是该类型。单个用户的情况并不真正需要接口,特别是如果您可以保证该范围。 但是,如果您要使用User,SuperUser,RestrictedUser等 - 他们如何实现不同的方法可能是特定的,而使用该界面的代码将只关心他们可以“做用户可以做什么” do“(例如”已经实现了界面“)
答案 2 :(得分:0)
它被称为多态分配,阅读这个帖子,它可能会给你一些线索:http://www.dreamincode.net/forums/topic/132538-what-is-polymorphic-assignment/
答案 3 :(得分:0)
这对于面向对象编程语言中的多态非常有用。 例如,您可以:
public class BadUser implements Iuser{
...
}
public class GoodUser implements Iuser{
...
}
和这样的一种方法:
void authenticated(Iuser user);
可以使用:
Iuser a = new BadUser();
Iuser b = new GoodUser();
authenticate(a); //OK;
authenticate(b); //OK;
但这不适用于:
void authenticated(GoodUser user);
Iuser a = new BadUser();
Iuser b = new GoodUser();
authenticate(a); //Error;
authenticate(b); //OK;