Ниже приведен пример передачи параметров в документ fxml через пространство имен.
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1">
<BorderPane>
<center>
<Label text="$labelText"/>
</center>
</BorderPane>
</VBox>
Определить значение External Text
для переменной пространства имен labelText
:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class NamespaceParameterExampleApplication extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws IOException {
final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("namespace-parameter-example.fxml"));
fxmlLoader.getNamespace()
.put("labelText", "External Text");
final Parent root = fxmlLoader.load();
primaryStage.setTitle("Namespace Parameter Example");
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}
}
Шаблон "посетитель" является способом сделать двойную отправку объектно-ориентированным способом.
для того, полезно, когда Вы хотите выбрать который метод использовать для данного аргумента на основе его типа в а не время компиляции во время выполнения.
Двойная отправка является особым случаем , несколько диспетчеризируют .
, Когда Вы называете виртуальный метод на объекте, это рассмотрело единственную отправку, потому что то, которым называют фактический метод, зависит от типа отдельного объекта.
Для двойной отправки, и тип объекта и метод тип единственного аргумента принят во внимание. Это похоже на разрешение перегрузки метода, за исключением того, что тип аргумента определяется во времени выполнения в двойной отправке вместо статически во время компиляции.
В нескольких-отправках, метод может иметь несколько аргументов, переданных ему и какая реализация используется, зависит от типа каждого аргумента. Порядок, что типы оценены, зависит от языка. В LISP это проверяет каждый тип от начала до конца.
Языки с несколькими диспетчеризируют, используют родовые функции, которые являются просто функциональными объявлениями и не похожи на общие методы, которые используют параметры типа.
, Чтобы сделать двойную отправку в C#, можно объявить метод с единственным объектным аргументом и затем определенные методы с определенными типами:
using System.Linq;
class DoubleDispatch
{
public T Foo<T>(object arg)
{
var method = from m in GetType().GetMethods()
where m.Name == "Foo"
&& m.GetParameters().Length==1
&& arg.GetType().IsAssignableFrom
(m.GetParameters()[0].GetType())
&& m.ReturnType == typeof(T)
select m;
return (T) method.Single().Invoke(this,new object[]{arg});
}
public int Foo(int arg) { /* ... */ }
static void Test()
{
object x = 5;
Foo<int>(x); //should call Foo(int) via Foo<T>(object).
}
}