私は、人気のあるMediaInfo ライブラリを .NET で使いやすくする OSS プロジェクトに取り組んでいますが、この質問は一般化できます。
派生クラスDが、その基本クラスDBのコンストラクターを呼び出すときに常にオブジェクトOをインスタンス化する場合。DB はその値をコンストラクターに送信された値に設定しますが、値自体はDBの基本クラスBで宣言されています。
- 誰がO (以下のコードの AKA mediaInfo)を「所有」していますか?
- .NET アプリケーションの場合、IDisposable を実装する必要があるのはどれですか? 注: Oは管理されていないか、少なくとも管理されていないライブラリにラップされた管理オブジェクトのインスタンス化ですが、「MediaInfo.Close();」の形式でクリーンアップする必要があります。これが「管理されていない」と見なされるかどうかはわかりません。
わかりやすくするために、実際のコードを使用してみましょう。
DはDBから派生します。
// MediaFile is "D"
public sealed class MediaFile : GeneralStream
{
public MediaFile(string filePath)
: base(new MediaInfo(), 0) {
// mediaInfo is "O"
mediaInfo.Open(filePath);
}
}
DBは、 Bから派生した継承されたOを設定します。
// GeneralStream is "DB"
public abstract class GeneralStream : StreamBaseClass
{
public GeneralStream(MediaInfo mediaInfo, int id) {
this.mediaInfo = mediaInfo; // declared in StreamBaseClass
// ...
}
}
BはOを宣言します。
// StreamBaseClass is "B"
public abstract class StreamBaseClass
{
protected MediaInfo mediaInfo; // "O" is declared
// ...
}