【问题标题】:Create new Instance of Object with Interface [duplicate]使用接口创建新的对象实例
【发布时间】:2013-12-04 15:08:16
【问题描述】:

我有一个接口和一个类。

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()

【问题讨论】:

  • 这是 C# 还是 Java,它被标记为两者。

标签: c# java oop interface


【解决方案1】:

您可以拥有实现相同接口的不同对象。

底层实现是什么并不重要,重要的是实现IUser接口的对象具有允许它使用getFirstNamegetLastName的方法。

这是一个额外的抽象层,使您的代码更简单、更有条理。

【讨论】:

    【解决方案2】:

    这个想法是该调用之后的代码只知道如何使用接口。他们不关心对象到底是怎样的或是什么,只要接口得到维护。可以对同一个接口进行多个实现,后续代码不会在意。

    通过只传递实现类 (User),所有后续代码都必须是该类型。单个用户的情况并不真正需要接口,特别是如果您可以保证该范围。 但是,如果您有 User、SuperUser、RestrictedUser 等 - 他们如何实现不同的方法可能是特定于他们的,而使用该接口的代码只会关心他们可以“做用户可以做的事情”做”(例如“已实现接口”)

    【讨论】:

      【解决方案3】:

      这叫做多态赋值,阅读这个帖子,它可能会给你一些线索:http://www.dreamincode.net/forums/topic/132538-what-is-polymorphic-assignment/

      【讨论】:

        【解决方案4】:

        这对于面向对象编程语言中的多态性很有用。 例如,您可以:

        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;
        

        【讨论】:

          猜你喜欢
          • 2018-04-25
          • 2016-08-13
          • 1970-01-01
          • 2016-09-18
          • 1970-01-01
          • 1970-01-01
          • 2011-10-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多