2017年4月29日土曜日

10: UNOの基本概念を学ぼう、パート1

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>

Main body START

我々は、UNOの基本概念を正確に理解する必要がある

-Hypothesizer

我々は、UNOの基本概念を正確に理解して、UNOをよく活用できるようにする必要がある。

-Rebutter

そう。何事においても、基本を正確に理解せずによく活用することはできない。

-Hypothesizer

あらかじめ言っておくが、参考文書における用語の使用法は、私にはときどきよく理解できない。例えば、「UNOオブジェクト」は、クラスインスタンスを意味しているのか、クラスを意味しているのか?「UNOコンポーネント」は、クラスを意味しているのか、Jarを意味しているのか、UNO拡張機能を意味しているのか?「サービス」という用語は、現れる箇所によらず同一の概念を表しているのか?. . . 我々のねらいは、各概念を別の概念と明確に区別し、各用語を単一の意味で使用することだ。このために、我々の用語使用法は、参考文書のものと少し違っている。別に奇をてらっているわけでなく、我々が自分で理解できるように記述するためには避けられないことなのだ。

-Rebutter

ははあ、まあ、やってみよう。

UNOオブジェクトとは何か?

-Hypothesizer

UNOオブジェクトからはじめよう。UNOオブジェクトは、UNOプロトコルを実行するクラスインスタンスだ。つまり、ただのJavaクラスインスタンスは、UNOプロトコルに従わないのでUNOオブジェクトではない。注意として、我々がUNOオブジェクトという用語を使うとき、それは、常にクラスインスタンスを意味しており、クラスのことではない。

-Rebutter

「UNOプロトコルを実行する」というのはどういう意味なのか?

-Hypothesizer

UNOで重要なことは、UNOオブジェクトが、別のプログラミング言語環境からでさえも、あらかじめ決められたように取り扱えることだ。それを可能にするには、あらゆるUNOオブジェクトが従うあるプロトコルがなければならない。このプロトコルを「UNOプロトコル」と私は呼んだ。

-Rebutter

ははあ。

-Hypothesizer

前の記事で開発したUNO拡張機能のおいては、LibreOffice Basicマクロ内の変数、l_hiUnoExtensions、から参照されていたオブジェクトがUNOオブジェクトだ。

-Rebutter

なるほど。

UNOコンポーネントとは何か?

-Hypothesizer

UNOオブジェクトをインスタンスとして作る元となるクラスを、我々は、「UNOコンポーネント」と呼ぼう。したがって、UNOコンポーネントは常に、クラスであって、クラスインスタンス、Jar、UNO拡張機能ではない。こうすれば、UNOオブジェクトとUNOコンポーネントの区別が明確になるだろう。

-Rebutter

ああ、明確だ。

-Hypothesizer

参考文書はコンポーネントという用語を奔放に使用しているようだが、我々は、「UNOコンポーネント」という用語を、この厳密に単一の意味で使用する。

-Rebutter

いいだろう。

-Hypothesizer

先のサンプルUNO拡張機能において、HiUnoExtensionsImplementationは、UNOコンポーネントだ。

-Rebutter

なるほど。

UNOインターフェースとは何か?

-Hypothesizer

UNOインターフェースとは、あるUNOコンポーネントの一つの様相の抽象的な外向きの表明だ。「抽象的」というのは、実装を含まないという意味だ。

-Rebutter

UNOインターフェースのUNOコンポーネントとの関係は、JavaインターフェースのJavaクラスとの関係と同じということでよいか?

-Hypothesizer

そうだ。JavaクラスがJavaインターフェースを実装するように、UNOコンポーネントはUNOインターフェースを実装する。実のところ、Javaでは、UNOインターフェースはJavaインターフェースであり、UNOコンポーネントはUNOインターフェースを実装するJavaクラスだ。上で様相という用語を使ったが、これは、UNOコンポーネントは、複数のUNOインターフェースを実装することができ、UNOインターフェースは、必ずしもUNOコンポーネントの全体を代表せず、UNOコンポーネントの一つの様相を代表するからだ。

ここで重要なのは、どのUNOコンポーネントも少なくとも一つのUNOインターフェースを実装しなければならないということだ。というよりも、Javaクラスは、UNOインターフェースを実装することでUNOコンポーネントになるというべきだろう。

-Rebutter

UNOインターフェースを実装するJavaクラスは、すべてUNOコンポーネントだということか?

-Hypothesizer

そうだ。我々の用語では、「UNOコンポーネント」と「UNOインターフェース実装」は同一のことを指している。

-Rebutter

なるほど。

-Hypothesizer

ルートとなるUNOインターフェース、'com.sun.star.uno.XInterface'、が存在し、他のUNOインターフェースはすべて、このルートUNOインターフェースの子孫インターフェースだ。一つのUNOインターフェースは、複数のUNOインターフェースを継承することができる、 . . . 今は。

-Rebutter

今は?

-Hypothesizer

つまり、昔の仕様ではできず、それが若干の複雑な事情の原因になっているが、それについては、後で述べよう。

-Rebutter

オーケー。

-Hypothesizer

サンプルUNO拡張機能において、XHiUnoExtensionsは、UNOインターフェースだ。

-Rebutter

なるほど。

Main body END

References

  • Apache OpenOffice Wiki. (2014/01/02). Apache OpenOffice Developer's Guide. Retrieved from https://wiki.openoffice.org/wiki/Documentation/DevGuide/OpenOffice.org_Developers_Guide

<このシリーズの、前の記事 | このシリーズの目次 | このシリーズの、次の記事>