【问题标题】:Java built-in class to interfaceJava 内置类到接口
【发布时间】:2013-02-28 01:47:09
【问题描述】:

你能创建一个继承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;
                   ...

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

【问题讨论】:

  • interface SubFragment extends Fragment {...} ?
  • 当你说“我想引入多态性”时,你具体想要它做什么?
  • @assylias 我收到一个错误:片段无法解析为类型
  • @Zutty 因为我解析 xml 并根据标签创建正确类的对象,然后设置属性。现在它有 15 个不同的类,它们表示对于每个标签,我必须检查 15 次它必须调用的函数,通过多态性,我可以让程序决定哪个函数
  • @GuntherVanGeetsom 是 Fragment 接口吗?

标签: java class interface built-in


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • interfaces 可以扩展其他接口(不确定提出问题的人真正在寻找什么)
    • 是的,只有其他接口,而不是我提到的类 :) 在这种情况下,我认为片段是一个抽象或具体的类。
    • 我知道,我只是补充一下,因为我不确定他们在寻找什么。在某些情况下,具有接口层次结构是有意义的,其他时候只使用抽象(甚至只是一个基)类就可以了。
    • @ThomasErnst 我无法编辑 Fragment 类,因为它是一个内置类
    • 然后我会说创建一个自己的基类/适配器,它扩展/委托给片段并实现您的接口。然后,您的所有具体类都应该从该新类继承。
    【解决方案3】:

    您可以创建一个通用的FragmentInterface 和其他扩展该FragmentInterface 的接口。

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

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

    【讨论】:

    • 但是FragmentInterface需要内置类'Fragment'的所有功能,所以我可以使用Fragment的功能
    【解决方案4】:

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

    根据您的评论,Fragment 是一个内置类并且不可编辑,似乎有几个选项。您可以引用一般扩展 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){
            ...
        }
    }
    ...
    

    【讨论】:

    • 这似乎是个问题,Fragment 是一个内置类,所以我无法更改任何东西
    • 对不起,我不知道。我会附上我的答案。
    • 感谢您的回答,但您能否再解释一下,也许可以举个例子?
    • 是的。我只是添加了一个示例。
    • 好的,谢谢,所以如果我要使用多态,我必须将所有常用函数添加到接口中吗?然后在我的主程序中我必须创建一个新的 Wrap 像 Wrap myWrap = new ChapterFragment(); //我定义的类然后我可以设置 myWrap.setBackground(color); 然后将 wrap 添加到片段列表中?
    【解决方案5】:

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

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

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

    旧答案:

    你自己已经给出了答案:

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

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

    【讨论】:

    • 很抱歉造成误会,Fragment 类是内置类所以功能很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    相关资源
    最近更新 更多