プロパティの構文が制限されるようになった!?

古い形式の構文を移行中ですが、プロパティの部分で問題が発生しました。
あるプロパティは、setはprivate、getはpublicだった訳ですが・・・。

// 旧形式 (Visual C++ .NET 2003)
__gc class FileInfo {
 private:
  __property Void set_FileName(String* val);
 public:
  __property String* get_FileName();
};

これを新しい構文では以下のように実装する(らしい)です。

// 新形式 (Visual C++ 2005)
ref class FileInfo
{
 private:
  String^ m_FileName; 
 property String^ FileName {
   void set(String^ val) { m_FileName = val;}
   String^ get()         { return m_FileName;}
  }
};

// 新形式(簡略表現)
ref class FileInfo
{
 property String^ FileName; {};
}

・・・!?。getとsetって纏めて宣言しなくちゃいけない!?
つまり、C#と構文を統一したことによって、getとsetが同じアクセスレベルになってしまったのです。CLSの規約ではアクセスレベルはバラバラに出来るという認識です。C++/CLIでも何とか旧形式と同じ書き方に出来ないものか・・・。privateやprotectedなプロパティとpublicプロパティを混ぜる方法募集中(トリッキーな手段は除く)。
(追記) 無事解決しました。

ref class FileInfo
{
 property String^ FileName {
  private:
   void set(String^ val) {
    m_FileName = val;
   }
  public:
   String^ get() {
    return m_FileName;
   }
  }
 private:
  String^ m_FileName;
};

括弧の中に書く発想がありませんでした。

(2006/01/13) 指摘により修正。読みやすくするため、一部削除。

Leave a Reply

3 Comments on "プロパティの構文が制限されるようになった!?"

Notify of
avatar
Sort by:   newest | oldest | most voted
t_yamo
Guest

setter/getterで異なるアクセスレベルが設定できるみたいですよ。
http://www.microsoft.com/japan/msdn/vs05/visualc/VS05Cplus.asp

konuma
Guest

コメントありがとうございます。
指摘どおり動作するのを確認しました。
纏めて宣言はしなくちゃならないのは変わらず、propertyの括弧の中にアクセスレベルを書けばいいということですね。見た目はちょっと不自然になりそうですが・・・。
C#の2.0でも同様の書き方が出来るのかなぁ・・・。
この記事も編集しておきます。

flora
Guest

プロパティーとアクセシビリティ

setアクセサ或いは、getアクセサだけ、アクセシビリテイィを変更できるのかなって思って調べてみた。
C++/CLIでプロパティーを使うときはこんな感じに
ref class CPTest
{
public:
property String^ mTest
……

wpDiscuz