English 中文(简体)
Java;将基类归入衍生品
原标题:Java; casting base class to derived class

为什么我对一个衍生的阶层进行基类检查?

例如,如果我有一个B类,延伸C类,那么我为什么不能这样做?

B b=(B)(new C());

还是这样?

C c=new C();
B b=(B)c;

让我更具体地谈谈我试图做些什么。 这里我要说的是:

public class Base(){
    protected BaseNode n;
    public void foo(BaseNode x){
        n.foo(x);
    }
}


public class BaseNode(){
    public void foo(BaseNode x){...}
}

我现在想设立一套新的班级,扩大基地和基地,如:

public class Derived extends Base(){
    public void bar(DerivedNode x){
        n.bar(x);//problem is here - n doesn t have bar
    }
}

public class DerivedNode extends BaseNode(){
    public void bar(BaseNode){
        ...
    }
}

因此,我基本上想增加基地和诺德基地的新功能,既扩大功能,又增加功能。 此外,基地和基地应能够自行使用。

如果可能,我真的愿意这样做。


因此,我最后把它 out倒,部分原因是马鲁冰·佩里的回答。

www.un.org/spanish/ga/president 我必须做的是,在建筑商的衍生物类别中,将n作为衍生出的,并完全发挥作用。

最佳回答

您需要使用<><>><>instanceof等关键词,以检查>>n <<>m>>n<<<>>n>n<<>>n<>>>>>>>上标的类型,并打上“strong>bar(><>>>>>>>>/strong>。 查询Derived.bar( 方法

public class Test{
    public static void main(String[] args){
        DerivedNode dn = new DerivedNode();
        Derived d = new Derived(dn);
        d.bar( dn );
    }
}

class Base{
    protected BaseNode n;
    public Base(BaseNode _n){
        this.n = _n;
    }

    public void foo(BaseNode x){
        n.foo(x);
    }
}


class BaseNode{
    public void foo(BaseNode x){
        System.out.println( "BaseNode foo" );
    }
}

class Derived extends Base{
    public Derived(BaseNode n){
        super(n);
    }

    public void bar(DerivedNode x){
        if( n instanceof DerivedNode ){
            // Type cast to DerivedNode to access bar
            ((DerivedNode)n).bar(x);
        }
        else {
            // Throw exception or what ever
            throw new RuntimeException("Invalid Object Type");
        }
    }
}

class DerivedNode extends BaseNode{
    public void bar(BaseNode b){
        System.out.println( "DerivedNode bar" );
    }
}
问题回答

因为如果B延伸C,就是指B,而不是C。

重新思考你试图做些什么。

现有的答案是抽象的论据,但我想作一个更为具体的答复。 页: 1 之后,该法典必须汇编和管理:

// Hypothetical code
Object object = new Object();
InputStream stream = (InputStream) object; // No exception allowed?
int firstByte = stream.read();

具体实施<代码>的 方法来自? 摘录于InputStream。 从哪里获得数据? 仅处理<条码>java.lang。 目标,作为<条码>输入Stream。 抛开一个例外,越好。

在我的经验中,像你重新描述工作那样,获得“双轨等级等级”。 <may><>>>发现这种通用物有所助益,但能够很快得到发。

You can create a constructor for B that takes C as a parameter. See this post for ideas to do what you re trying to do.

基地班次对来自这些班级的课堂没有任何了解,否则会出现上述问题。 降幅是一种密码轮,基类降幅特别好。 这种设计也可能难以解决循环依赖问题。

如果你想要一个基类使用衍生产品,则使用模版方法,即在基类中添加一种虚拟或抽象的方法,并在衍生产品类别中加以执行。 然后,你可以安全地从基类中提这个问题。

你不能这样做,因为C不一定要执行你在B年延长时所制造的行为。

因此,C类方法有<代码>foo()。 然后,你知道,你可以把<代码>foo(> on a B,因为B扩展了C,因此,你可以把B处理成一个C,有(C)(新B()

但是,如果B有<条码>/条码>的方法,则子关系中的任何内容都说,你也可在C上打<条码>/条码>。 因此,你不能将C视为B,因此不能 cast。

在你的前辈中,如果你确信N是DerivedNode的,或者你可以使用通用物:

public class Base<N extends BaseNode> {
    protected N n;
    public void foo(BaseNode x){
        n.foo(x);
    }
}


public class BaseNode {
    public void foo(BaseNode x){...}
}

public class Derived extends Base<DerivedNode> {
    public void bar(DerivedNode x){
        n.bar(x); // no problem here - n DOES have bar
    }
}

public class DerivedNode extends BaseNode {
    public void bar(BaseNode){
        ...
    }
}

由于<代码>B 扩展了C,因此B可能 st在C(例如,你在新C(C)中最初在建筑商中的变数)





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签