私はクラスGraph
とサブクラスMyGraph
を持っていると言って、Graph
にはメソッドbuild
があり、独自のビルドプロセスを定義できます。継承を伴うスカラのフィールド初期化とコンストラクタシーケンス
MyGraph
には、node
のフィールドが宣言されています。これはビルドメソッドでは初期化する必要があります。したがって、私はそれがnullであると宣言します。しかし、MyGraph
インスタンスを作成すると、実行順序は最初にMyGraph.build
になり、次にvar node : Node = null
になり、ノードはnullのままになります。
親から呼び出されたメソッドでこのようなフィールドを初期化する正しい方法は何ですか?
class Graph {
def build:Unit = Unit
build
}
class MyGraph extends Graph {
var node : Node = null
override def build:Unit = {
node = new Node
}
}
[編集]私の使用事例の詳細:Graphクラスは、計算タスクのノードを含む計算グラフを表します。グラフには入力と出力があります。サブクラスでは、ユーザーが入力データを提供するために入力ノードを公開する必要があります。より詳細なコードを提供しています。
class Graph {
val inputs = new ArrayBuffer[InputNode]()
var output: Node = null
def build:Unit = Unit
build
def newInput(): InputNode = {
val in = new InputNode()
inputs += in
in
}
def setOutput(out: Node) {
this.output = out
}
def compute():Unit = {
inputs.foreach(_.computeAndForward())
}
}
class LinearRegGraph extends Graph {
var w : InputNode = null
var x : InputNode = null
var b : InputNode = null
override def build:Unit = {
w = newInput()
x = newInput()
b = newInput()
val mul = new MulNode(w,x)
val add = new AddNode(mul, b)
setOutput(add)
}
}
object Main extends App {
val graph = new LinearRegGraph()
graph.x.setData(...)
graph.w.setData(...)
graph.b.setData(...)
graph.compute()
graph.output.getData()
}
私は現在、次の一時的な解決策を使用しています。しかし、このコードはノード構築シーケンスの実装に対して脆弱であり、私はそれを気に入らない。
class LinearRegGraph extends Graph {
def w = inputs(0)
def x = inputs(1)
def b = inputs(2)
override def build:Unit = {
val w = newInput()
val x = newInput()
val b = newInput()
val mul = new MulNode(w,x)
val add = new AddNode(mul, b)
setOutput(add)
}
}
あなたが特定のユースケースの詳細を与えることができれば、私はあなたがいくつかを得るのを助けることができますリファクタリング – acidghost
@acidghost私が取り組んでいる問題について、より詳細な説明を追加しました。 – Harper