2

你能创建一个继承java内置类所有功能的接口吗?

我正在尝试做的事情:

我有很多扩展 Fragment 的类,在这些类中有一些属性(get、set)和一些函数。在制作了不同类的对象后,我将它们放在一个通用的片段列表中。

但是我想介绍多态性:1个接口类和所有其他类都实现了它,因此它们可以覆盖函数。

但问题是,如果我想使用多态性,我需要一个接口,并且接口应该是一个 Fragment,所以我仍然可以将这些 Fragment 放入一个列表中,那么我可以从 Fragment 类创建一个接口还是该接口可以继承从碎片?

在图像上你可以看到当前的情况

当前的

更新

这是一些代码来显示我想要实现的目标:

所以我有我的主要功能,它是一个 xmlSAXParser,当我遇到一个标签时,我创建了一个正确类的对象:

case template:
        switch (typeObjecten.toType(atType)) {
        case NOVALUE:
            break;
        case chapter:
            chapter = new ChapterFragment();
            typeObject = "chapter";
            break;
        case execute:
            execute = new ExecuteFragment();
            typeObject = "execute";
            break;
        case first:
            first = new FirstFragment();
            typeObject = "first";
            break; 
                              ...

当我找到结束标记时,我将正确的对象添加到列表中:

case template:
        switch (typeObjecten.toType(typeObject)) {
        
        case NOVALUE:
            break;
        case chapter:
            fragments.add(ownFrag);
            break;
        case execute:
            fragments.add(execute);
            break;
        case first:
            fragments.add(first);
            break;
        case navigation:
            fragments.add(navigation);
            break;
        case story:
            fragments.add(story);
            break;
                          ....

也有可能在每个类中背景都可能改变,现在我必须检查对象是哪个类来调用正确的函数:

case background:
        
        if (typeObject.equalsIgnoreCase("navigation")) {
            navigation.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("chapter")) {
            //chapter.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("first")) {
            ownFrag.setBackgroundColor("#" + text);
            first.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("execute")) {
            execute.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("story")) {
            story.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("intro")) {
            intro.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("mission")) {
            mission.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("question")) {
            question.setBackgroundColor("#" + text);
        } else if (typeObject.equalsIgnoreCase("info")) {
            info.setBackgroundColor("#" + text);
        }
        break;
                   ...

因此,如果我可以制作一个“全局”片段然后程序自己找出它必须从哪个类调用哪个函数(多态性?)

4

5 回答 5

1

另一种选择是使 Fragment 抽象并让您的类扩展它。然后,如果可能,您还可以添加一些共享功能。

根据您的评论,片段是内置类且不可编辑,似乎有几个选项。您可以引用一般扩展片段的对象 <? extends Fragment> 或通过在 Fragment 上创建一个包装类来保存和维护它的实例。这会给你更多的控制权。

一个简单的示例可能如下所示。

class CannotModify{
    public void doSomething(){}
}




public interface AddThisIfYouWant{
    public void doSomething();
}




public class Wrap extends CannotModify, implements AddThisIfYouWant{
    private final CannotModify yourInstance;

    public Wrap(){
        this.yourInstance=new CannotModify();
    }

    @Override
    public void doSomething(){
        super.doSomething();
    }

}

如果您只需要在片段级别引用您的对象,您也可以扩展片段。例如:

public class AnotherFragment extends Fragment{...}

...
public void somethingWithFragments(List<? extends Fragment> fragments){
    for(Fragment fragment:fragments){
        ...
    }
}
...
于 2013-03-12T14:00:13.743 回答
1

根据 Fragment 是内置类的信息进行了编辑。

您的基本问题的答案是:不,在 Java 中,您不能扩展具有新行为的预定义类(例如,使其实现另一个接口)。例如,您可以在 Objective-C 中做到这一点。但在您的情况下,您似乎不需要它。

定义一个 Fragment 的子类,它具有您需要的行为,并实现您需要它实现的接口,并从该子类派生您的其他类。

老答案:

你自己已经给出了答案:

但问题是,如果我想使用多态性,我需要一个接口,并且接口应该是一个 Fragment

正如您现在绘制的类图,Fragment 类没有数据,也没有默认行为,因此根本没有理由将其作为所有其他类的基类。只需将 Fragment 定义为一个接口(使用您需要的方法声明),并为它们实现该接口的其他类指定。

于 2013-03-12T14:14:04.307 回答
0

您应该为 Fragment 创建一个接口并让所有类扩展该接口

于 2013-03-12T13:54:16.173 回答
0

首先。没有接口不能扩展类,这会破坏接口的语义(仅签名)。

你可以做的是让“片段”简单地实现新创建的接口。

于 2013-03-12T13:59:42.717 回答
0

您可以制作一个通用FragmentInterface接口和其他扩展它的接口FragmentInterface

当您可以制作基本接口时,为什么只需要一个接口,以及扩展该基本接口的其他接口?

顺便说一句,一个类也可以实现多个interfaces.

于 2013-03-12T13:59:49.110 回答