- PR -

クラスの継承

投稿者投稿内容
パンダ
ベテラン
会議室デビュー日: 2004/03/24
投稿数: 59
投稿日時: 2004-04-21 15:31
すみません。
ClassBはClassZのことです。
インターフェースが複数実装できるのは理解できます。
だからpublic classZ : IClassB, IClassCの記述はOK。

やりたいことはイメージ的にはpublic classZ : ClassA, IClassB, IClassC
のような記述をしたいのです。でもこれはNGです。
このNG記述をできるだけスマートな記述にしたいのです。

一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-04-21 15:54
言語仕様はご覧になりました?
>public classZ : ClassA, IClassB, IClassC のような記述をしたいのです。
そのような記述ができると思いますが。
パンダさんの現在書かれているソースのその部分を貼り付けてもらって良いですか?
言語仕様(先ほど示したリンク先)を見てもらえば分かると思いますが、class-base部分には継承するクラス(ClassA)を一番先頭、インターフェイスはその後に書いてくださいね。

ちなみに、
コード:

public class ClassA
{
public void f()
{
}
}

public interface IClassB
{
void f1();
}
public interface IClassC
{
void f2();
}

public class ClassZ : ClassA, IClassB, IClassC
{
void IClassB.f1()
{
}
void IClassC.f2()
{
}
}


これでコンパイル通りましたけど。


[ メッセージ編集済み 編集者: 一郎 編集日時 2004-04-21 15:59 ]
パンダ
ベテラン
会議室デビュー日: 2004/03/24
投稿数: 59
投稿日時: 2004-04-21 16:35
以前、同じようなコーディングしてエラーになっているのを憶えています。
ただ、別のエラーを勘違いしていただけかもしれません。

現在のプロジェクトでもう一度やってみます。

いのつち
ベテラン
会議室デビュー日: 2002/05/14
投稿数: 73
投稿日時: 2004-04-23 01:16
パンダさんが悩まれているのは、ひょっとしてこのことかも。
(違っていたらすみません)

一郎さんのコードを呼び出す側
コード:
  ClassZ z = new ClassZ();
  z.f();
  z.f1();  //コンパイルエラー
  z.f2(); //コンパイルエラー


になります。明示的な実装なためで、この場合、IClassB,IClassC型にしないと
f1,f2は呼び出せません。

コード:
 ClassZ z = new ClassZ();
 IClassB b = z;
 b.f1();
 IClassC c = z;
 c.f2();



上のコードだと明示的にインターフェイス型のため、呼び出すことができます。

コード:
   public class ClassZ : ClassA,IClassB,IClassC
  {
      public void f1(){}  //<-ここ
      public void f2(){} //<-ここ
  
  
  // 呼び出し側
  public static void Main(string[] args)
    {
       // すべてOK
       ClassZ z = new ClassZ();
       z.f1();
       z.f2();
    ((IClassB)z).f1();
        ((IClassC)z).f2();


     }
}


この場合は、型変換しなくても呼び出しは可能です。
アティ
ベテラン
会議室デビュー日: 2003/08/14
投稿数: 91
お住まい・勤務地: KANAGAWA
投稿日時: 2004-04-23 09:27
すみません。ちょっと意味が分からないのですが。
インターフェースを実装したのであれば、そのインターフェースのメソッドを書かないといけないですよね?

引用:

いのつちさんの書き込み (2004-04-23 01:16) より:
パンダさんが悩まれているのは、ひょっとしてこのことかも。
(違っていたらすみません)

一郎さんのコードを呼び出す側
コード:
  ClassZ z = new ClassZ();
  z.f();
  z.f1();  //コンパイルエラー
  z.f2(); //コンパイルエラー


になります。明示的な実装なためで、この場合、IClassB,IClassC型にしないと
f1,f2は呼び出せません。

コード:
 ClassZ z = new ClassZ();
 IClassB b = z;
 b.f1();
 IClassC c = z;
 c.f2();



上のコードだと明示的にインターフェイス型のため、呼び出すことができます。

コード:
   public class ClassZ : ClassA,IClassB,IClassC
  {
      public void f1(){}  //<-ここ
      public void f2(){} //<-ここ
  
  
  // 呼び出し側
  public static void Main(string[] args)
    {
       // すべてOK
       ClassZ z = new ClassZ();
       z.f1();
       z.f2();
    ((IClassB)z).f1();
        ((IClassC)z).f2();


     }
}


この場合は、型変換しなくても呼び出しは可能です。

一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-04-23 09:55
>インターフェースを実装したのであれば、そのインターフェースのメソッドを書かないといけないですよね?

いのつちさんのされている話は、どう実装するかの話ですね。
キーワードは「明示的実装」です。

参考:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csspec/html/vclrfcsharpspec_13_4.asp
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-23 09:58
「明示的なインターフェイスの実装のチュートリアル」
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csref/html/vcwlkexplicitinterfaceimplementationtutorial.asp

これも
アティ
ベテラン
会議室デビュー日: 2003/08/14
投稿数: 91
お住まい・勤務地: KANAGAWA
投稿日時: 2004-04-23 12:52
Jittaさん、一郎さん
わかりました。
俺が「明示的な実装」という呼び方を知らなかったこと(実装の仕方は知ってました。)と、
呼び出される側のコードが無かったんで勘違いしてしまいました。

スキルアップ/キャリアアップ(JOB@IT)