我最近开始学习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
。
很抱歉,如果我的问题有点模糊,但我尽量做到尽可能具体。
答案 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等。然后迭代列表,根据它的类型打印特定的东西,这样你就会明白什么是多态结束为什么需要它。
通过提供方法覆盖,您将看到特定于子类型的打印属性非常简单并且具有多态性。