DOBON.NET DOBON.NETプログラミング掲示板過去ログ

newが使えないクラスの初期化について

環境/言語:[Framework1.1 VS.NET2003 C#]
分類:[.NET]

こんにちは
早速質問なんですが、XmlNodeやXmlNodeListみたいにnewを使ってクラスを初期化できないようなクラスがありますが、これの初期化ってどうやっているのでしょうか?
過去ログで「http://dobon.net/vb/bbs/log3-30/18392.html」のような継承クラスを作成して、キャストしてというような方法を見つけました。
しかし、これだとGetTypeで得られる値が異なりました。(例えば継承元のクラスをXmlNodeList、継承先がCXmlNodeListならGetTypeで得られるのが、XmlNodeList、CXmlNodeList)
Frameworkで最初から用意されているメソッドの戻り値だとGetTypeの値もXmlNodeListというようになります。
継承もとのクラスのままで初期化する方法が分かる方いましたらお願いします。
たとえば、System.Dianostics.Process クラスもコンストラクタが隠蔽化されています。
Process クラスの場合は、

System.Dianostics.Process ps = System.Dianostics.Process.Start("...");

と Start 静的メソッドにて生成されます。
> Process クラスの場合は、
>
> System.Dianostics.Process ps = System.Dianostics.Process.Start("...");
>
> と Start 静的メソッドにて生成されます。

なるほど、メソッドで初期化ですか。

では、実際に内部でどんな事してるのでしょうか?
最初に見つけたXmlNodeListの例で言うと、何らかの条件でXmlNodeの配列を取得してXmlNodeListを生成したい場合の処理では具体的にどうしたらよいでしょうか?



XmlNodeList nodeList = GetNodeList();



//メソッド
private XmlNodeList GetNodeList()
{
}

とあるときにGetNodeListでXmlNodeListを初期化して、何か特定のXmlNodeを追加していく、またはXmlNodeの配列をXmlNodeListに変換するという処理をしていると思うのですが、自分で用意したメソッド内でそのような事をする方法があるのでしょうか?
説明ベタで上手く表現できてないかと思いますが宜しくお願いします。
適当に XmlNodeList から派生させたクラスを自作してください。
GetNodeList を呼び出す人からすれば、実体が何であれ返値は XmlNodeList 型です。
> 適当に XmlNodeList から派生させたクラスを自作してください。
これは最初からやっていることです。
しかしGetTypeでの戻り値が異なるので、おやっ?っと思って質問させていただきました。
MSが用意したメソッド(例えばMSDNによるとXmlNode.ChildNodesなど)ではGetTypeで得られる値もXmlNodeListとなっております。もしMSのライブラリで派生クラスを作ってキャストしてなんて処理をしているのならばGetTypeで得られる値も派生クラスになっていると思います。きっと何か初期化する方法があると思って質問させていただいております。

private XmlNodeList GetNodeList()
{
 XmlNodeList nodeList;
 CXmlNodeList cNodeList = new CXmlNodeList(); //適当に派生させたクラス
 nodeList = (XmlNodeList) cNodeList;
 return nodeList;
}

と適当に作って、得られた戻り値のGetTypeを見るとCXmlNodeListとなっていました。
これを強制的にXmlNodeListに変換する方法というのはあるのでしょうか?
はて、そもそも XmlNodeList は abstract ですから実体を作れませんが。
.NET 1.1 でも .NET 2.0 でも、XmlDocument に適当な xml 食わせて DocumentElement.ChildNodes を GetType() しても System.Xml.XmlChildNodes とやらが返りますし。
SelectNodes の値は .NET のバージョンによって異なりますが System.Xml.XPath.XPathNodeList だったり System.Xml.XPathNodeList だったり。
2007/05/25(Fri) 11:01:01 編集(投稿者)

■No19750に返信(LoadShowさんの記事)
> private XmlNodeList GetNodeList()
> {
>  XmlNodeList nodeList;
>  CXmlNodeList cNodeList = new CXmlNodeList(); //適当に派生させたクラス
>  nodeList = (XmlNodeList) cNodeList;
>  return nodeList;
> }
>
> と適当に作って、得られた戻り値のGetTypeを見るとCXmlNodeListとなっていました。
> これを強制的にXmlNodeListに変換する方法というのはあるのでしょうか?

Hongliangさんの方法で事実上問題ない判断方法だと思いますが、
「(GetTypeメソッドの結果を)強制的にXmlNodeListに変換」したいのはなぜでしょうか?

GetTypeメソッドのヘルプを読むとわかりますが、
インスタンスの型を返すメソッドですので、
GetTypeメソッドの戻り値をXmlNodeListとして扱うことはできません。

GetTypeメソッドは嘘の型を返せないようになっています。
「プログラミング Microsoft .NET Framework」(著:Jeffrey Richter)という
.NET系開発者のバイブルとも呼べる本に解説がありますので、
もし読まれたことが無いようなら、読まれることをお勧めします。

#編集により以下を追加。
最初のLoadShowさんの投稿にある以下のコメントについて。

> Frameworkで最初から用意されているメソッドの戻り値だとGetTypeの値もXmlNodeListというようになります。
> 継承もとのクラスのままで初期化する方法が分かる方いましたらお願いします。

GetTypeメソッドの仕様からするとXmlNodeListが返ることはないはずです。
具体的に使用された「Frameworkで最初から用意されているメソッド」は何ですか?
また、そのGetTypeの値がXmlNodeListだったという結果の確認手順を明記してください。
#他の方にも確認してもらって、同様の現象がおきるなら、
#それは.NET Frameworkの不具合の可能性もありますから

DOBON.NET | プログラミング道 | プログラミング掲示板