C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[12]: プロパティの型指定についての疑問


(過去ログ 40 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■20884 / inTopicNo.1)  プロパティの型指定についての疑問
  
□投稿者/ ネタ好き(インドリ) (1回)-(2008/06/19(Thu) 10:27:44)
ネタ好き(インドリ) さんの Web サイト

分類:[C++/CLI] 

今日C++/CLIに関してブログを書いてた際に思い出したんだけど、プロパティに何故型を何度も指定する必要があるのでしょうか?
サンプルが無いと分かりにくいと思いますので提示します。

http://indori.blog32.fc2.com/

public ref class Bird
{
	//フィールド</font>
private:
	Int32 m_age;
	String^ m_name;
public:
	property Int32 Age {
		String^ get() { return this->m_age; } //ここが嫌!
		void set( Int32 value ) {
			if ( value > 0 ) m_age = value;
		}
	}

	property String^ Name {
		String^ get() { return this->m_name; } //ここが嫌!
		void set( String^ value ) { this->m_name = value; }
	}

	//メソッド</font>
	void Talk( ) {
		Console::WriteLine( "私は{0}。年は{1}だよ。", this->m_name, this->m_age); 
	}
};

このようにプロパティには同じ型を三度も書かなくてはなりません。
その理由が私にはさっぱり分かりません。
皆様はこの件に関してどう思われますか?

引用返信 編集キー/
■20886 / inTopicNo.2)  Re[1]: プロパティの型指定についての疑問
□投稿者/ 774RR (194回)-(2008/06/19(Thu) 11:07:40)
> String^ get() { return this->m_age; }
違う型に(暗黙のうちに)変換しているわけですな。ということはちゃんと型名が必要でしょうな

引用返信 編集キー/
■20891 / inTopicNo.3)  Re[2]: プロパティの型指定についての疑問
□投稿者/ ネタ好き (458回)-(2008/06/19(Thu) 12:42:31)
No20886 (774RR さん) に返信
>>String^ get() { return this->m_age; }
> 違う型に(暗黙のうちに)変換しているわけですな。ということはちゃんと型名が必要でしょうな
>

ごめん書き間違ったけど、そこはInt32 get() { return this->m_age; } です。

引用返信 編集キー/
■20894 / inTopicNo.4)  Re[3]: プロパティの型指定についての疑問
□投稿者/ 774RR (195回)-(2008/06/19(Thu) 13:12:08)
# まあ書き間違いだろうとは最初から思ってたわけだけど
当初提示コードのごとくに String を返却するような「プロパティ」であっても C++ 的には
一向にかまわないわけで、そー言うコードが組める余地が残してあると解釈すべきなわけだ

実行時効率だけを考えれば、メンバー変数を public にして直接操作させるほうが高いわけで
メンバー変数へのアクセスに
書式上の工夫だけで勝手に1関数呼び出しフックが自動的にかかる=暗黙に効率が落ちる、くらいなら
実行効率を落としうる箇所は一目でそれとわかるべきである=きっちりメンバ関数を実装しなはれ
ということなんだろうな
それが C/C++ の伝統的文化というわけで
引用返信 編集キー/
■20897 / inTopicNo.5)  Re[4]: プロパティの型指定についての疑問
□投稿者/ ネタ好き (460回)-(2008/06/19(Thu) 13:32:14)
No20894 (774RR さん) に返信
> # まあ書き間違いだろうとは最初から思ってたわけだけど
> 当初提示コードのごとくに String を返却するような「プロパティ」であっても C++ 的には
> 一向にかまわないわけで、そー言うコードが組める余地が残してあると解釈すべきなわけだ

それが・・・私もそう思ってString^とかInt64を試してみたのですが・・・

エラー 1 error C3901: 'get': 戻り値の型 'int' を指定しなければなりません

ってエラーを出されました。
それで私は疑問を持ったわけです。intしか指定させないのならば始めから書かすな!って。
私はInt64とかByteとかを指定できれば納得するのですが、コンパイラはInt32以外認めてくれません。
私はこの動作が不思議で仕方がありません。

引用返信 編集キー/
■20899 / inTopicNo.6)  Re[5]: プロパティの型指定についての疑問
□投稿者/ 774RR (196回)-(2008/06/19(Thu) 13:36:27)
C++ は VB みたいに「なんでもかんでも暗黙の変換アリアリ」ではないので
自動的に暗黙変換されない場合には明示変換してやればいいよ

引用返信 編集キー/
■20900 / inTopicNo.7)  Re[6]: プロパティの型指定についての疑問
□投稿者/ ネタ好き (462回)-(2008/06/19(Thu) 13:40:29)
No20899 (774RR さん) に返信
> C++ は VB みたいに「なんでもかんでも暗黙の変換アリアリ」ではないので
> 自動的に暗黙変換されない場合には明示変換してやればいいよ
>

再度有難うございます。明示変換を試してみました
Int64 get() { return Convert::ToInt64( this->m_age ); }
それでもやはり、
エラー 1 error C3901: 'get': 戻り値の型 'int' を指定しなければなりません
ってエラーを出されました。私の明示変換の仕方が間違っているのでしょうか?

引用返信 編集キー/
■20981 / inTopicNo.8)  Re[7]: プロパティの型指定についての疑問
□投稿者/ ネタ好き (475回)-(2008/06/22(Sun) 19:46:11)
2008/06/22(Sun) 20:00:57 編集(投稿者)
参りましたね・・・親切な774RRさん以外の回答がないorz
うーん、この不思議仕様の由来が知りたい。
ですから質問の範囲を広げます。
由来でなくてもプロパティに3回の型名を記述することに利点を感じる人の意見も募集します。
ちなみに、プロパティは冗長なだけではなくて、省略記法がある事を発見しました。

private:
String^ name;

public:
property String^ Name {
    String^ get() { return this->m_name; } //ここが嫌!
    void set( String^ value ) { this->m_name = value; }
}


こんなよくある実装の場合、なんと!こう書けます。

public:
property String^ Name;

これはどういう事かという、「フィールドの宣言を省略できる」ということです。これは素直に嬉しい。
でもだからこそ不思議なのです。こんな高度な記述が出来るC++/CLIが何故型名を三回も書かなくてはならないのか・・・

引用返信 編集キー/
■20982 / inTopicNo.9)  Re[8]: プロパティの型指定についての疑問
□投稿者/ れい (670回)-(2008/06/22(Sun) 20:13:39)
No20981 (ネタ好き さん) に返信
> でもだからこそ不思議なのです。こんな高度な記述が出来るC++/CLIが何故型名を三回も書かなくてはならないのか・・・

戻り値や引数の前には型名があったほうが分かりやすいというだけ、
言語のスタイルの問題かと。

property String^ Name {
String^ get() { return this->m_name; } //ここが嫌!
void set( String^ value ) { this->m_name = value; }
}

どれか一個でも欠けていたら
部分的には気持ち悪くてしょうがないです。

void set( value ) { this->m_name = value; }
キモチワルイ。




引用返信 編集キー/
■20984 / inTopicNo.10)  Re[9]: プロパティの型指定についての疑問
□投稿者/ ネタ好き (476回)-(2008/06/22(Sun) 21:05:43)
No20982 (れい さん) に返信
> どれか一個でも欠けていたら
> 部分的には気持ち悪くてしょうがないです。
>
> void set( value ) { this->m_name = value; }
> キモチワルイ。

なるほど、value変数を明示するために型名を三回書かせる仕様になったのですね。
それは十分ありえると思います。
valueを定義するために型名を三回も書かすなんてC++/CLIは案外お茶目ですね。

property String^ Name

ここの時点でコンパイラはわかっているのにあえて訊くw
見方を変えたら面白いですね。
引用返信 編集キー/
■20985 / inTopicNo.11)  Re[9]: プロパティの型指定についての疑問
□投稿者/ Azulean (149回)-(2008/06/22(Sun) 21:15:44)
> property String^ Name {
>     String^ get() { return this->m_name; } //ここが嫌!
>     void set( String^ value ) { this->m_name = value; }
> }
これ、宣言と定義分けると次のような感じでしたよね?

public ref class Sample
{
private:
  String^ m_name;
public:
  property String^ Name {
    String^ get();
    void set(String^ value);
  }
};

String^ Sample::Name::get()
{
  return this->m_name;
}

void Sample::Name::set(String^ value)
{
  this->m_name = value;
}

propertyの行に型がある必要がないように感じますが、何か理由があったんでしょう。
それは設計者に聞くか、聞いた/読んだことがある人じゃないと答えられないと思います。

-----

> こんなよくある実装の場合、なんと!こう書けます。
> 
> public:
> property String^ Name;
これを読んで、event EventHandler Hogehoge { add { } remove {} }な構文に形を合わせたget/set関数かなとも思う。

引用返信 編集キー/
■20986 / inTopicNo.12)  Re[10]: プロパティの型指定についての疑問
□投稿者/ Hongliang (277回)-(2008/06/22(Sun) 21:25:04)
引数つきプロパティとの兼ね合いじゃないかな
引用返信 編集キー/
■20987 / inTopicNo.13)  Re[11]: プロパティの型指定についての疑問
□投稿者/ ネタ好き (477回)-(2008/06/22(Sun) 21:28:07)
No20986 (Hongliang さん) に返信
> 引数つきプロパティとの兼ね合いじゃないかな

おお!それかもしれない。
引用返信 編集キー/
■20989 / inTopicNo.14)  Re[12]: プロパティの型指定についての疑問
□投稿者/ ネタ好き (478回)-(2008/06/22(Sun) 22:22:02)
皆様、私の質問に付き合ってくれて有難うございます。
皆様の意見を頼りに調べてみたところ、Hongliangさんが言ったとおりで「引数つきプロパティ」が原因だという結論に至りました。
そして、れいさんが言ったようにvalue変数の明示化によって、美的な意味合いで型が三回いるのでしょう。
おかげ様ですっきりしました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -