【问题标题】:assigning super class a reference java为超类分配参考java
【发布时间】:2012-07-25 05:49:27
【问题描述】:

我有一个带有构造函数的类 Vector

Vector(int dimension) // creates a vector of size dimension

我有一个扩展 Vector 类的 Neuron 类

public class Neuron extends Vector {

    public Neuron(int dimension, ... other parameters in here ...) { 
         super(dimension);
         // other assignments below here ...
     }    
}

我希望能够为 Neuron 类中的 Vector 分配对另一个 Vector 的引用。类似于

    public Neuron(Vector v, ... other parameters in here ...) { 
         super = v;
         // other assignments below here ...
     }    

当然,我不能这样做。有什么解决办法吗?即使我无法在 Neuron 类的构造函数中执行此操作,也可能没问题。

【问题讨论】:

  • 想要这样做通常表明您应该使用composition instead of inheritance
  • 除非必须,否则我不会使用 Vector。我会使用 ArrayList 而不是子类。最好根据需要使用委托。
  • Vector 是我自己的类,它模仿数学向量的行为。我应该说清楚,我不是在这里谈论 java.util Vector 类。然而,这更像是一个关于分配对超类的引用的一般问题。

标签: java inheritance reference superclass


【解决方案1】:

你需要在Vector类中创建一个copy constructor

public Vector(Vector toCopy) {
    this.dimension = toCopy.dimension;

    // ... copy other attributes
}

然后在Neuron 你做

public Neuron(Vector v, ... other parameters in here ...) { 
     super(v);
     // other assignments below here ...
}

您也可以考虑使用 composition 而不是 inheritance。事实上,这是 Effective Java 中的建议之一。在这种情况下,你会这样做

class Neuron {
    Vector data;

    public Neuron(Vector v, ... other parameters in here ...) {
        data = v;
        // other assignments below here ...
    }
}

相关问题:

【讨论】:

  • 我实现了类似的东西,但它并没有给我我想要的东西。维度指定 Vector 类中数组的大小。该数组是该类的唯一成员,所以这就是我所拥有的:'public Vector(Vector toCopy) { this.array = toCopy.array }' 但是,当我使用复制构造函数执行 'Vector v2 = new Vector( v1); System.out.println(v1); System.out.println(v2);'它打印出两个不同于 v1 = v2 的东西。虽然当我对一个向量进行更改时,它会传递到另一个向量。
  • 只要您对一个数组进行this.array = toCopy.array 更改,也会影响另一个数组。只要避免诸如System.arraycopy之类的东西就可以了。
  • 有趣的是,您发布了有关组合与继承的链接,因为我之前使用过组合并切换到继承,因为它使代码更干净一些,但也许我应该切换回来。
  • 当改为继承时,它通常在代码方面看起来更简洁一些,但它没有那么灵活和易于维护。经验法则是使用继承,当且仅当类之间存在真正的 is-a 关系。所以,问问自己,一个神经元是一个向量吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2014-11-10
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多