将接口用作超类时,实施多态的合适解决方案是什么

时间:2016-09-05 07:32:24

标签: java arraylist interface polymorphism

我最近开始学习Java编程语言,我想在模拟智能设备的应用程序上测试我的多态知识。

我创建了一个名为Os的接口,这个接口的主要工作是向其继承者指示他们应该为自己实现什么。

public interface Os {
   public ArrayList<App> getApps(); 
   public void installApps(Collection<App> apps);
}

然后我创建了两个类,一个用于android,另一个用于ios。 我还创建了一个名为App的接口和两个继承它的类,名为AndroidApp和IosApp。

现在我想尽可能多地使用polymorphysm,但是我很难理解哪个位于哪里。我希望Android操作系统有自己的私人收藏,只接受这样的AndroidApp类型 ArrayList<AndroidApp> 但我想,因为我想实现接口的getApps方法,我不能在接口中放置该方法的返回类型,所以我需要在层次结构中的上层,所以我将我的私有列表更改为{{1 }}

我有一个方法负责在Osez上安装应用程序。

ArrayList<App>

正如我之前提到的,getApps负责将我所选择的任何Os上安装的应用程序退回给我。

这是一个概念性问题。我无法弄清楚我是否应该为Android和Ios使用更具体的集合。 喜欢这个

public class Android implements Os {
    private ArrayList<App> androidApps;
    public void installApps(Collection<App> apps) {
      //I want to only install Android apps(adding them to my private collection
        for (App app : apps) {
            if(app instanceof AndroidApp){
              System.out.println("installing android app ... "   +app.getAppName()+" installed!");
                androidApps.add(app);
            }
            else
                System.out.println(app.getAppName()+" is not an android app!");
        }
    }
}

而不是使用

public class AndroidOs{
    private Collection<AndroidApp> androidApps;
}

但如果我会使用第一个私有集合,我的界面将失去其作为两个操作系统的通用接口的目的,因为当我尝试为android实现public class AndroidOs{ private Collection<App> androidApps; } 时,我无法强制转换{{ 1}}到getApps

很抱歉,如果我的问题有点模糊,但我尽量做到尽可能具体。

2 个答案:

答案 0 :(得分:2)

听起来你正在寻找generic type parameter

public interface Os<A extends App> {
   List<A> getApps(); 
   void installApps(Collection<A> apps);
}

public class Android implements Os<AndroidApp> {
    private ArrayList<AndroidApp> androidApps;

    @Override
    public void installApps(Collection<AndroidApp> apps) {
        for (AndroidApp app : apps) {
            System.out.println("installing android app ... "   +app.getAppName()+" installed!");
            androidApps.add(app);
        }
    }
}

答案 1 :(得分:1)

首先要做的事情:你说你想尽可能多地使用多态,但在软件开发中,没有任何方法或设计模式能够尽可能多地使用;他们在需要时使用&#34; &#34;。因此,您必须在需要时使用所有技术和内容。但无论如何我只是理解你想在这里学习多态。

定义:

  

多态性是一种物体采取多种形式的能力。该   在父类中,OOP中最常见的多态性使用   reference用于引用子类对象。   (来源:http://www.tutorialspoint.com/java/java_polymorphism.htm

现在来自发展世界的真实样本:你有一个动物&#34;列表&#34;对象并且您希望将所有动物保留在缓存列表中,您从数据库中获取并在某个UI中表示,但在显示它们时,每种动物类型都有不同的东西。所以在这里你必须使用多态来将所有对象保存在一个地方,并根据它们的微小变化分配属性。

bptest.sarlm

创建对象

Base interface: Animal-->eat();feet();
Animal1: Elephant :: Animal-->eat(){print "grass"};feet(){print "four feet"};
Animal2: Eagle :: Animal-->eat(){print "meat"};feet(){print "two feet"};

现在,您将大象和老鹰放在一个列表中,并通过检查类型或每个项目的字段来执行您想要的任何操作。

您的问题详情:

List<Animal> animals = new ArrayList<>();
animals.add(new Elephant());
animals.add(new Eagle());

问题一:这种结构是否正确?

答案:是的,出于特定原因。让我们假设您有一个由几个开发人员开发的相当庞大的应用程序。你是开发者。领导和决定这个项目的结构和技术,你希望所有操作系统的结构都像你的界面:让我们说我们想添加黑莓,然后我们将从操作系统和应用程序的BlackberryApp应用程序派生我们的BlacberryOS。这将为您提供添加到系统的每个新操作系统的一致性,这是真的。

问题二:有更好的方法吗?

答案:总是更好的方法。在这里,您说您是Java PL开发的新手并希望学习多态。所以我建议你像我解释的那样尝试:创建操作系统列表并添加AndroidOS,OIS,Blackberyy等。然后迭代列表,根据它的类型打印特定的东西,这样你就会明白什么是多态结束为什么需要它。

通过提供方法覆盖,您将看到特定于子类型的打印属性非常简单并且具有多态性。