如何使Java类知道要扩展什么?

如何解决如何使Java类知道要扩展什么?

假设我们有三个类,ParentChild1 extends Parent implements ISomethingChild2 extends Parent implements ISomethingElse。现在,我要制作Child3,根据extends收到的内容,它可以Child1 Child2Child3

Child3构造函数是这样的:

public <T extends Parent> Child3(T child) {}

如何使Child3知道要扩展哪个类? (不要回答Parent。假设扩展Parent会破坏代码,而Parent则不会实现任何内容

解决方法

您提到了ISomething和ISomethingElse。这表示您希望子类具有不同的功能(可能组合在一起)。

在这种情况下,继承是不合适的。

SDL_WaitEvent

这是更加通用和动态的。但有人可能想要:

class Parent {

    // Untyped but safe.
    private Map<Class<?>,Object> capabilities = new HashMap<>();

    protected <I> void register(Class<I> intf,I obj) {
        capabilities.put(intf,obj);
    }

    public <T> Optional<T> lookup(Class<T> intf) {
        Object obj = capabilities.get(intf);
        return obj == null ? Optional.emtpy() : Optional.of(intf.cast(obj));
    }
}

interface Flying {
    void fly(double altitude);
}

Parent pelican = new Pelican();
Flying flying = pelical.lookup(Flying.class).orElse(null);
flying.fly(0.5);

pelical.lookup(Swimming.class).ifPresent(
    swimming -> swimming.swim(true);
);

class Bird extends Parent { ... } // With Swimming capability

class Pelican extends Bird {

    public Pelican() {
        register(Swimming.class -> new Swimming() {
            @Override public void swim(boolean atSurface) { ... }
        });
    }
}

在您的情况下,您似乎想要一个对象具有ISomething或ISomethingElse,因此这是一个解决方案。

如果这一切似乎开销太大,请考虑授权

class Pelican extends Bird implements Swimming {

    @Override
    public void swim(boolean atSurface) {
        return lookup(Swimming.class).get().swim(atSurface);
    }
}

鹈鹕实际上是委托给游泳实施的。

,

不能。继承结构是在编译时定义的(除非您使用魔术)。

您必须创建两个类,然后将构造函数替换为工厂方法(或一对工厂方法)。

PS:如果可能,您可以考虑用委派替换继承。

,

与继承相比,您更喜欢合成:

public class Parent {}

public interface ISomething {}

public interface ISomethingElse {}

public class Child1 extends Parent implements ISomething {}

public class Child2 extends Parent implements ISomethingElse {}

// Child 3 does not inherits from other classes
public class Child3<T extends Parent> {
    
    private final T child;
    
    public Child3(T child) {
        this.child = child;
    }
    
    public T getChild() {
        return this.child;
    }
}

// Consumer checks type of contained value.
// If you dont want to check types you can
// create adapter classes for each subclass of parent
public class Consumer {
    
    public void test(Child3 child3) {
        
        if (child3.getChild() instanceof Child1) {
            final Child1 child1 = (Child1) child3.getChild();
        }
        if (child3.getChild() instanceof Child2) {
            final Child2 child2 = (Child2) child3.getChild();
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?