- 締切済み
C# 自作クラスのキャストについて
Xavalの回答
- Xaval
- ベストアンサー率58% (61/105)
もともとのキャスト対象のインスタンス(WData)は、XXXParam のインスタンスでしたか? つまり、 XXXData WData = new XXXParam (); されてますか? 単なる XXXData WData = new XXXData (); されたものをそういうキャストはできません。 キャスト方向が逆です。
関連するQ&A
- 「自作クラスの型」にキャストする方法について。
「自作クラスの型」にキャストする方法について。 Java初心者ですが、よろしくお願いします。 class AAA class BBB ※クラスAAAはクラスBBBのスーパークラス(直属のスーパークラスとは限らない)とします。 class CCC という3つのクラスがあるとして、 この場合、 class CCC{ AAA var; BBB bbb; void test(){ bbb = new BBB(); var = (AAA)bbb; //---★ } } というような、キャストは可能ですよね?(←確認1) 次に(確認1に問題が無い場合)、 クラスAAAとクラスBBBの格納場所(パッケージ関連の話です)について、 AAAとBBBがどういう位置関係にあるときに、上記のキャストは可能になるのでしょうか? AAAとBBBが同一パッケージ内にある時だけでしょうか?(←確認2[質問の核]) で、さらに、 上記の「---★」の所で、 AAAクラスにキャストする処理をしていますが、 この時、AAAクラスのコンストラクタは呼ばれるのでしょうか? (AAAをnewしていないけれど、キャスト処理でnewしたのと同じことになったりしますか?) また、これと同様の質問になりますが、 仮に、クラスAAAの設計が、クラスAAAのインスタンスが生成された場合に、 何らかのコールバック処理が行われるような設計の場合、 この (AAA)bbb というキャストによって、想定しているコールバック処理 は行われたりしますでしょうか?(←確認3) 初心者らしからぬ質問かもしれませんが、 どなたか、どうか分かりやすく教えて下さい。
- ベストアンサー
- Java
- C#におけるObjectのキャストについて
こんにちは。 C#におけるObjectのキャストについて、基本的なことにつまずいてしまいました。 以下のような継承関係にあるクラスで、InvalidCastExceptionが投げられてしまいます。 public class ClassA {} public class ClassA_Ex : ClassA {} ClassA_Ex ex = (ClassA_Ex)new ClassA(); キャストできない訳はないと思うのですが…。 何か大きな見落としがありそうですが、よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- 【C#】フォームクラスと他クラスとの連携について
C#を勉強し始めたばかりの者です。 オブジェクト指向言語が初めてなので、オブジェクト指向的考え方が出来てないゆえの質問だとは思うのですが・・・。 質問内容ですが、フォームクラスと他のクラスとの連携方法がわかりません。 具体的に言いますと、フォームクラスで別のAというクラスを宣言し、そのクラスのB()メソッドを実行したときに中で発生した例外メッセージをフォームのコントロールで表示したい、という場合、どうすればよいのでしょうか? Doメソッドで例外メッセージをstringとして返し、それをフォームクラスの方で処理するしかないのでしょうか? お知恵を貸してください。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- ダイアログのクラス化で仮想関数を用いて派生クラスにしているんです
ダイアログのクラス化で仮想関数を用いて派生クラスにしているんですが・・・ ダイアログを基本クラスで静的プロシージャと派生クラスでオーバーライドしてプロシージャを使いたい のですが、どうしても自身のポインタが取得できません。 以下にソースを載せておきます。 class CBaseWnd { public: // ポインタの設定 void SetPointer( HWND hWnd ); // ウィンドウプロシージャの呼び出し static LRESULT CALLBACK CallProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); // ウィンドウプロシージャの実装 virtual LRESULT MainProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); }; [クラスの実装] //===== ポインタの設定 =====// void CBaseWnd::SetPointer( HWND hWnd ) { SetWindowLong( hWnd, GWL_USERDATA, (LONG)this ); } //===== ウィンドウプロシージャの呼び出し =====// LRESULT CALLBACK CBaseWnd::CallProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { //_プロパティリストからthisポインタを取得 //ここでポインタを取得することができないでいます。値が0です。 //先にSetWindowlongをやっても値が0のままです。 CBaseWnd* thisPtr = (CBaseWnd*)GetWindowLong( hWnd, GWL_USERDATA ); //_thisポインタが取得できなかった場合... if( ! thisPtr ) { //_ウィンドウの作成時の場合... //ここでアクセス違反というエラーが起きる if( message == WM_INITDIALOG ) thisPtr = (CBaseWnd*)((LPCREATESTRUCT)lParam)->lpCreateParams; //_thisポインタが取得できた場合... if( thisPtr ) { //_プロパティリストにオブジェクトハンドル(thisポインタ)を設定する thisPtr->SetPointer( hWnd ); } } //_thisポインタが取得できた場合... if( thisPtr ) { LRESULT lResult = thisPtr->MainProc( hWnd, message, wParam, lParam ); return lResult; } return DefWindowProc( hWnd, message, wParam, lParam ); } //===== ウィンドウプロシージャの実装(継承可能) =====// // ここでの記述はデフォルトの処理 // LRESULT CBaseWnd::MainProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { //_ウィンドウが破棄された場合 case WM_DESTROY: PostQuitMessage(0); return 0; //_デフォルトの場合 default: return DefWindowProc( hWnd, message, wParam, lParam ); } } WM_INITDIALOGでダイアログの初期化中にポインタを取得しようとしますが、アクセス違反が起こり失敗します。 どなたか分かる方がいらっしゃったらご指摘お願いします。
- ベストアンサー
- C・C++・C#
- 総称型のキャストでエラー
下の書き方で、※1はエラーにならないのですが ※2ではエラーになります。 ※1がキャスト可能であれば、 ※2も可能だとおもうのですが。 Java7を使っています。 public class Soushou { void test() { List<Kodomo> kodomoList = new ArrayList<Kodomo>(); List<? extends Oya> oyaList = kodomoList; Object o1 = (List<Oya>) oyaList; // ※1 エラーにならない。 Object o2 = (List<Oya>) kodomoList; // ※2 「キャストすることができません」エラーになってしまう。 } } class Oya { // 親クラス } class Kodomo extends Oya { // 親クラスを継承した子クラス }
- ベストアンサー
- Java
- Stringの値で型キャストしたい(Java)
最近OKWaveでお世話になっています。 表現がおかしいかもしれませんが、Stringの変数の値を使って、型キャストしたいです。 様々なオブジェクトが入る配列(Vector)を使用しているため、VectorをObject型にして使用しています。 配列のある要素をget()したのち、getClass().getSimpleName()でクラス名を取得し、そのクラス名を、 Object obj = array.get(i); String name = obj.getClass().getSimpleName(); if(name.equal("Integer")) { method((Integer)obj); ・ ・ ・ のような形で、場合分けして、メソッドを呼び出しています。 ですが、この方法だと、条件分岐が増えて、見づらいです。 そこで、クラス名を取得したnameをうまく使ってobjを型キャストしたいです。 これを解決させる方法もしくはヒントを教えてください!
- ベストアンサー
- Java
- VC#2010 ArrayListに入れた要素の型
こんにちは。ArrayListに異なる型のクラスを入れて、後からそれがどの型か判断してから処理しようとしているのですが、エラーになってしまいます。 //ベースオブジェクトクラス class BaseObj { string path; BaseObj(string p){path = p:} } //製品Aクラス BaseObjを継承 class ProductA : BaseObj { ProductA(string p) : base(p) {} } //製品Bクラス BaseObjを継承 class ProductB : BaseObj { ProductB(string p) : base(p) {} } ------------------------------------------- ArrayList ObjList;//オブジェクトを格納する ProductA A = new ProductA(@"C:\"); ProductB B = new ProductB(@"D:\"); ObjList.Add(A); ObjList.Add(B); ------------------------------------------- //ここでは、0番目にAが入ってると分かっているのでAかBか調べる処理は省いてます。 MessageBox.Show'((ProductA)ObjList[0]).path); 上記メッセージボックスのところで、 型 'System.Collections.Generic.List`1[Application.ProductA]' のオブジェクトを型 'Application.ProductA' にキャストできません。 というエラーになってしまいます。これはどうしてなのでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- C++.NETのWindowsフォームで自作クラスを制御したい
C++.NETでWindowsフォームアプリを作っています。 状況をわかりやすくするために、例えを使って説明すると ・Form.h起動時に、自作の「おにぎり」クラスのオブジェクト(obj)を1つ作成する。「おにぎり」クラスには「塩をふる」と「のりをまく」の2つの関数がある。 ・Form.h上には ボタン1、ボタン2がある。 ・ボタン1をクリックしたときのイベントとして、objの「塩をふる」、ボタン2をクリックしたときのイベントとして、objの「のりをまく」を実行するようにしたい いろいろ調べた結果、http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_03.htmlに行き当たり、自動生成されたWindowsフォームのソース(?)と、自作のクラスは単純に混在できない、ということがわかりました。 そこで質問なのですが、 ・このURLに書かれているとおりラッパークラスというものを作る必要があるのでしょうか? ・別の情報では、クラスを宣言するときにポインタとして宣言(おにぎり* obj)し、コンパイラの指示通り、.から->へ変えるだけでよい、とありましたがそれは解釈違いでしょうか? 現状では後者のように設定すると正常にコンパイルできるのですが、イベント発生時の「塩をふる」という関数内部で例外が発生します。(イベントごとにオブジェクトを作成する方法だと例外が発生しないので、関数のバグではないはずです) まとめると、フォーム内のすべてのイベントが1つのオブジェクトに対して動作する、というケースを想定しているわけです。 何かアドバイスなどいただけないでしょうか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 【PHP】クラスを継承した際にデータ型も継承すると
とある有料のオンライン学習サイトをつかっています。 学習項目の流れは以下の通りです。 現在「15 型の継承について見ていこう」で躓いています。 01 オブジェクトを使ってみよう (02:56) 02 投稿に関する処理を作ろう 03 クラスでデータ型を定義しよう 04 インスタンスを作ってみよう 05 コンストラクタを使ってみよう 06 クラスを整理しておこう 07 アクセス修飾子について見ていこう 08 メソッドを介してプロパティを操作しよう 09 プロパティで型宣言をしてみよう 10 staticキーワードを使ってみよう 11 オブジェクト定数を使ってみよう 12 クラスを継承してみよう 13 子クラスで独自の実装をしていこう 14 メソッドをoverrideしてみよう 15 型の継承について見ていこう *型の継承 *型を継承するメリット この項目で記述されているソースコードは下記のとおりです。コード内のクラス、SponsoredPostは クラスPostを継承しています。よって両方のクラスともにPost型として扱えると説明があります。 ソース内のこの箇所で processPostという関数を作成し、変数$postにPost型と型付けをしています そしてforeachでPostで型付けられた$post型(クラスPostとそれを継承したクラスSponsoredPost)をひとつづつ取り出し、processPostを用いてそれぞれにshow()メソッドで表示させています。 ----------------------- <?php class Post{ protected $text; public function __construct($text){ $this->text = $text; } public function show(){ printf('%s',$this->text); } class SponsoredPost extends Post{ private $sponsor; public function __construct($text, $sponsor){ parent::__construct($text); $this->sponsor = $sponsor; } public function show(){ printf('%s by %s', $this->text, $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('iPhone','Apple'); function processPost(Post $post){ $post->show(); } foreach($posts as $post){ processPost($post); ------------- クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。「15 型の継承について見ていこう」という項目では 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 と解説してあります。 クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。私の知っているデータ型(文字列型、整数型、浮動小数点数型、論理型、配列型、オブジェクト型、リソース型、NULL)は下記の2か所だけです。 show()メソッド内の、['%s']と['%s by %s']で文字列が指定されています。 したがってこの項目で説明されている 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 とは、「クラスを継承する際にプロパティやメソッドだけでなく、データ型、ここでは(['%s']と['%s by %s'])も継承されるということが説明されているという解釈でよろしいのでしょうか? 少し混乱しています。もし私の解釈が間違っているようでしたら教えてください。 初学者です。よろしくお願いいたします。 <表示結果>
- ベストアンサー
- PHP
- 親子関係を持つ自作クラスのDownCast
.NET2.0ベースのVBです。次のコードをビルドしようとすると、CTypeの部分がエラーとなり、「変換演算子によって、ある型からその派生型に変換することはできません」とメッセージがでます。派生クラスに対して、ある一定の法則でダウンキャストさせたいのですが、なぜ不可能なのでしょうか。また、このようなアプローチは間違っているでしょうか。 Public Class Class1 ' このクラスは別ファイルに定義されており、 ' そのファイルは ReadOnly。 Public foo Public bar Public baz End Class Partial Class Class1 ' 継承クラスで実装すると、クラス階層構造がより一層複雑になるので、Partial として実装。 ' ダウンキャスト用にキャスト演算をオーバーロード Public Shared Narrowing Operator CType(ByVal value As Class1) As Class2 Dim result As New Class2 ' .foo は移さない! result.bar = value.bar result.baz = value.baz Return result End Operator End Class Public Class Class2 : Inherits Class1 Public hoge End Class
- ベストアンサー
- Visual Basic