お世話になります。
C#でインターフェースに定義した抽象プロパティで、アクセシビリティまで設定したいです。
例として抽象プロパティHelloのgetをpublic、setをinternalに設定したい場合、次の様に書くと怒られます。
string Hello { get; internal set; } ←"アクセシビリティ修飾子をインターフェイスのアクセサーで使用することはできません。"
抽象プロパティにsetを定義せず、サブクラスでinternalを設定して実装する分には怒られませんが、
この場合はサブクラスに対してsetの実装を強制できませんし、
当然API(インターフェース)型変数からsetの実装を呼び出せません。

全てのクラスはAPIからのみ利用させたいと考えていて、
かつプロパティのset、getで設定したいアクセス修飾子が異なる様な場合、
プロパティを使用せず自前でアクセッサを作るしか無いのでしょうか?
何かおいしい逃げ方がありましたらご教示いただけるとありがたいです。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

「インターフェイス」に定義するものは公開するもの、つまりアクセシビリティは常にpublicですからこれはどーしよーもありません。



代替案としては、インターフェイスではなく抽象クラスに定義して、その抽象プロパティのモディファイア(set)にうっかり飛んできたら例外でも飛ばすようにしておくなんてのはどうでしょうか。
    • good
    • 0
この回答へのお礼

確かにおっしゃる通りです。
自分が定義を勘違いしていたふしがあったようです。
そもそも私が「メソッドでやるしか」とかなんとかのたまっていましたが、
そもそもメソッドでやっても同じ事でした。
代替案をいただきます。
インターフェイスと抽象クラスとで定義を分けて、
万が一の予期しない使用に対してはアサートで落とすという方向で検討しようと思います。
ご回答ありがとうございました。

お礼日時:2011/04/19 16:33

interfaceを二つ用意する



public interface IHelloGet{string Hello { get;}}
internal interface IHelloGetSet{string Hello { get; set;}}
    • good
    • 0
この回答へのお礼

なるほど、そういう手もありましたか。
今回はコミットできませんが、今後の肥やしとさせていただきます。
ご回答いただき、ありがとうございました。

お礼日時:2011/04/19 16:23

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Qなぜインタフェースを使うのか?

カテゴリはJavaですが、オブジェクト指向という観点での質問です。

私はオブジェクト指向を勉強中です。(C#)
そこで、疑問に思ったのがタイトルで示したインタフェースについてです。
以下に疑問を列挙します。

1.インタフェースはなぜ使うのですか?
2.使うメリットはなんですか?
3.インタフェースのインスタンスって作れるのですか?
4.インタフェースは必ずどこかのクラスに継承されないといけないのですか?
 単体では何もできないのですか?
5.具体的な使い方を教えてください。

全部でなくてもよいのでわかる方ご教授よろしくお願いいたします。

Aベストアンサー

インターフェースとは「役割」です。
一般的なインターフェースの命名規則は「~ableを末尾に付ける」とあります。例えば「比較できる」なら「ICompareble」です。
メディア再生ならplay,stop等を持ったIPlayableインターフェースが考えられます。これで動画、音楽、静止画が文字通り「再生できます」。

クラスは実装とインターフェースの両方を継承しますが、これでは不便なことが沢山あります。最も不便なのは、余計なメソッドが沢山付いてくること、多重継承でもしない限り、継承だけでは機能を共有しきれない(多重継承は多重継承で、別の問題がある)事です。

インターフェースにはこの制約がありません。「~ができる」という役割に必要なメソッド群を定義し、その役割を持たせたい複数のクラスに実装させれば良いのです。
また逆に、1つのクラスに複数の役割を持たせることができます。


インターフェースは、引数の型指定に使うと用途がよく分かります。
元のインスタンスが何を継承していようと、インターフェースを通じて操作できるのはそのインターフェースに定義されたメソッドだけ、つまり純粋に「ある役割について操作したい」というメソッドを定義できます。


1.インタフェースはなぜ使うのですか?
 継承では制約が多い場面で、特定の「役割」に基づいた操作を定義したいとき、インターフェースを使います。

2.使うメリットはなんですか?
 継承より制約が少ないことです。中身が空っぽというデメリットは、「委譲」で回避できます。委譲とは、実装済みのクラスに処理を委ねてしまう(単なるクラス呼出し)です。

3.インタフェースのインスタンスって作れるのですか?
 作れませんが、インターフェースの引数や変数に、インターフェースを実装したクラスのインスタンスを代入できます。この辺の使い勝手は普通のクラスと同じです。

4.インタフェースは必ずどこかのクラスに継承されないといけないのですか?
 単体では何もできないのですか?
 中身がありませんし、それだけではインスタンス化できませんから、YESです。

5.具体的な使い方を教えてください。
 理論的な話なら「Javaオブジェクト設計」というペーター・コード氏の著作をお薦めします。

 C#での具体例なら、参考URLにプラグインの作り方が載っています。

参考URL:http://dobon.net/vb/dotnet/programing/plugin.html

インターフェースとは「役割」です。
一般的なインターフェースの命名規則は「~ableを末尾に付ける」とあります。例えば「比較できる」なら「ICompareble」です。
メディア再生ならplay,stop等を持ったIPlayableインターフェースが考えられます。これで動画、音楽、静止画が文字通り「再生できます」。

クラスは実装とインターフェースの両方を継承しますが、これでは不便なことが沢山あります。最も不便なのは、余計なメソッドが沢山付いてくること、多重継承でもしない限り、継承だけでは機能を共有しきれ...続きを読む

QC# シリアル通信でデータ受信時の欠損について

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

--------------------------------------------------------------------------------------
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bytesRead = 0;
// Initialize a buffer to hold the received data
byte[] buffer = new byte[this.serialPort.ReadBufferSize];

try
{
bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
if (true == serialPort.IsOpen)
{
serialPort.DiscardInBuffer();//受信バッファをクリアする
}

}
catch (Exception ex)
{
DataLog.Exception(ex);
}

//派生クラス用の処理
DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
DeviceClassEvent(this, _DeviceClassEventArgs);
}
--------------------------------------------------------------------------------------

ネットの情報を参考に、
ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで
とりあえず正常に取ることが出来たのですが、これでいいのでしょうか?
期待するデータ量がわからなかった場合は使えないのかなとも思います。

データが欠損してしまう理由、
上記の対処法以外の一般的な対処法など有りましたら教えて下さい。

その他参考になるページ等ありましたら教えていただけると大変助かります。

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

-------------------------------------------------------------------------------...続きを読む

Aベストアンサー

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
    //if (true == serialPort.IsOpen)
    //{
    // serialPort.DiscardInBuffer();//受信バッファをクリアする
    //}

    // 受信バッファにデータがなくなるまで繰り返し読込む
    while (true)
    {
      if (0 == serialPort.BytesToRead)
      {
        break;
      }
      buffer[bytesRead] = (byte)serialPort.ReadByte();
      bytesRead++;
      System.Threading.Thread.Sleep(0);

      // シリアルポートの受信バッファには、
      // ・必要なブロックの途中から受信している。
      // ・次のブロックの先頭部分も受信されている。
      // 可能性があるので、ここで必要なブロックだけRead()できたことを確認する。
      if (必要なブロックが正常に読めたか確認する関数())
      {
        break;
      }
    }
  }
  catch (Exception ex)
  {
    DataLog.Exception(ex);
  }

  //派生クラス用の処理
  DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
  DeviceClassEvent(this, _DeviceClassEventArgs);
}

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Le...続きを読む

Q英語で「個数」「件数」は?

質問は単純です。
英語で「個数」や「件数」をなんというか、です。

とりあえず、思いついたのは、numberでした。
たとえば、「りんごの個数」は"a number of apples"ですか?
でも、"a number of"は「いくつかの」という意味ですよね。

「データの件数」は"a number of data"でしょうか?

私は英語はほとんど出来ませんが、numberは「個数」というよりも「番号」という意味であるような気がしてなりません。

Aベストアンサー

>「個数」や「件数」をなんというか、です。
>とりあえず、思いついたのは、numberでした。
意外に思われるかもしれまんせんが、語の選択はnumberであっています、と思います。

>「りんごの個数」
the number of (the) apples

>「データの件数」
the number of (the) data

>numberは「個数」というよりも「番号」という意味であるような気がしてなりません。
実は、昔、私も、「個数や件数はなんていうのかな、え、number? え、本当?」と、奇異に感じたことを、思い出しました。

Q戻り値と返り値の違い

タイトルの通りの質問内容です。
僕が調べた限りは「同じ」と言う意見が多数でした。
中には

・参照渡しした引数の関数通過後の結果が戻り値、
 関数自体が返すのが返り値

とか

・引数なしの関数で戻るのが戻り値、引数ありの関数で
 戻るのが返り値

とかはたまたその逆とか、混沌としています。

気になります。

Aベストアンサー

同じものだと考えて結構でしょう。所詮両方とも英語の "return value" の訳語ですから。

QC# 計算処理中に実行中ウィンドウを表示させたい。

アドバイスをお願いいたします。

やりたいこと:
(1)メインウィンドウで「計算始めるボタン」を押す。
(2)すると計算中には「実行中」の文字が別ウィンドウで立ち上がる。
(3)計算が終わると別ウィンドウが閉じる。

下記プログラムの不具合:
別ウィンドウで「実行中」の文字を出させたいが、文字部分が描画されない。

注意: 
下記プログラムはAthlon3000+で1秒ほどかかります。
CPUが遅いマシンで試す場合は「//計算処理」部分のfor重みを軽減させて実行して下さい。

using System;
using System.Drawing;
using System.Windows.Forms;

//メインウィンドウ
public class MainForm : Form {
private Button button;
private Label label;
public MainForm() {
button = new Button();
button.Text = "計算GO!!";
button.Click += new System.EventHandler(button_click);
label = new Label();
label.Location = new Point(50,50);
label.Text = "メインウィンドウ!";
Controls.Add(button);
Controls.Add(label);
Text = "MainForm";
BackColor = Color.Blue;
}

static void Main() {
Application.Run(new MainForm());
}

//計算GOボタンをクリックした時の処理
private void button_click(object sender, System.EventArgs e) {
double z;
SubForm Sub = new SubForm();

Sub.Show();

//計算処理
for(int i=0; i<=500000000; i++)
z = double.MaxValue * double.MinValue;

Sub.Close();

MessageBox.Show("計算終了");
}
}

//計算中を通知するウィンドウ
public class SubForm : Form {
private Label label;
public SubForm(){
label = new Label();
label.Text = "実行中!";
label.Location = new Point(50,50);
Text = "計算中通知ウィンドウ";
BackColor = Color.Red;
Controls.Add(label);
}
}

アドバイスをお願いいたします。

やりたいこと:
(1)メインウィンドウで「計算始めるボタン」を押す。
(2)すると計算中には「実行中」の文字が別ウィンドウで立ち上がる。
(3)計算が終わると別ウィンドウが閉じる。

下記プログラムの不具合:
別ウィンドウで「実行中」の文字を出させたいが、文字部分が描画されない。

注意: 
下記プログラムはAthlon3000+で1秒ほどかかります。
CPUが遅いマシンで試す場合は「//計算処理」部分のfor重みを軽減させて実行して下さい。

using System;
using S...続きを読む

Aベストアンサー

このような場合はマルチスレッドにするのが常套手段だと思います。

例えば、ボタン押した時にウインドウを作成表示し、計算スレッドを起動。計算スレッドの終了時にウインドウを閉じるのような動作にします。
逆に、Formの方を新規のスレッドにする手もありますが。

WIN32 API呼び出すより楽です。

[HOWTO] Visual C# .NET を使用してスレッドを作成する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;815804

C#プログラミング入門 第7回:マルチスレッドプログラミング
http://www.stackasterisk.jp/tech/dotNet/csharp07_02.jsp

参考URL:http://www.stackasterisk.jp/tech/dotNet/csharp07_02.jsp

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q親子って英語で何ていうんですか?

家族はファミリーですけど親子って英語で何ていうんですか?スペルと読み方を教えて下さいお願いします。

Aベストアンサー

parent and child
しかないようですよ。

Q【C#/Java?】try-catchでcatchせずにfinallyは一般的?

普段はJavaを使っているのですが、故あってC#のソースを簡易レビューすることになりました。

C#を始めてそれほど間もない人間の書いたソースなのですが、以下のようなソースをたびたびみかけます。

try
{
  // 処理
}
finally
{
  // finally処理
}

C#の場合、Javaとは異なり全ての例外はJavaで言うところの非チェック例外であると認識しています。(ただし、Javaの非チェック例外と同じ扱いをしていいとは思っていませんが……)
呼び出し元に起きうる全ての例外処理を任せるがfinally処理をしたいならば、このような書き方をするのが一般的なのでしょうか。

Javaの場合でもこのような書き方ができることは確認しましたが、Javaの場合は非チェック例外が起きる=バグであることがほとんどなので、このような書き方をする場面はあまりないように思います。
(もちろんチェック例外もthrowsを書けば同じように書くこともできるとは思いますが、自分ならやらないですし、そのようなソースを見たこともないです)
ですので、単に自分がJavaを普段使っているからcatchがないことに違和感を感じるだけなのであれば、この問題はスルーしたいと思います。


C#経験者が周りにいない状況ですので、皆様のお知恵をおかりしたいと思います。よろしくお願いします。

普段はJavaを使っているのですが、故あってC#のソースを簡易レビューすることになりました。

C#を始めてそれほど間もない人間の書いたソースなのですが、以下のようなソースをたびたびみかけます。

try
{
  // 処理
}
finally
{
  // finally処理
}

C#の場合、Javaとは異なり全ての例外はJavaで言うところの非チェック例外であると認識しています。(ただし、Javaの非チェック例外と同じ扱いをしていいとは思っていませんが……)
呼び出し元に起きうる全ての例外処理を任せるがfinally処理を...続きを読む

Aベストアンサー

Javaの場合ですが、わたしは、よくこの書き方をします。

チェック例外でも、非チェック例外でも、例外処理を呼び出し元に任せるような設計にすることはあると思います。
呼び出された方では、例外の処理方法が決められないようなケースではcatchしないし、その場で処理すべき例外ならcatchするようにします。

例外をcatchするべきかということと、finallyで何らかの回復処理をしなければならないこととは、そもそも別の話なので、finally節だけになることがあるのは、自然なことだと思います。
finallyだけということは、finallyですべきことはあるが、そこでは例外をcatchすべきでないからcatchが無いと考えた方がいいでしょう。
逆に用もないのにcatchするのはよくないです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報