FC2ブログ

[Development][C#] インターフェースの多重継承

using System;

namespace sample
{
interface INF1
{
int func1();
}

interface INF2
{
// INF2で"int func1()”を宣言していない点に注意
int func2();
}

class Imprement1 : INF1
{
int i;
public Imprement1()
{
i = 1;
}
public int func1()
{
return i;
}
}

class Imprement2 : INF2
{
int i;
int j;
public Imprement2()
{
i = 2;
j = 3;
}
public int func1()
{
return i;
}
public int func2()
{
return j;
}
}
class App
{
static void Main(string[] args)
{
Imprement1 imp1 = new Imprement1();
Imprement2 imp2 = new Imprement2();
INF1 inf1;
INF2 inf2;

inf1 = (INF1)imp1;
inf2 = (INF2)imp2;

int valImp1 = imp1.func1();
int valImp2a = imp2.func1();
int valImp2b = imp2.func2();
int valInf1 = inf1.func1();
// int valInf2a = inf2.func1(); // CS0117
int valInf2b = inf2.func2();
}
}
}

 インターフェースは多重継承が可能。

 なお、特化された側のインターフェース(=INF2)では、メソッド"int func1()"を宣言していない点に注目。

 インターフェース"INF2"を継承した実装クラス"Imprelent2"では、"int func1()"を実装しているため、呼び出し可能。ただし、クラス"Imprelent2"で実装された"int func1()"はインターフェース"INF2"とはなんの関係もない独自メソッドになっているようだ。


 "Imprement2"を参照するインターフェース変数"INF2 inf2"では、メソッド"func1()"にはアクセスできないとして、コンパイルエラーCS0117。

 逆に、実装クラス"Imprement1"でメソッド"int func1()"、実装クラス"Imprement2"でメソッド"int func2()"を実装しないと、コンパイルエラーCS0535。

スポンサーサイト



theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

{Development][C#] foreach文 / インデクサ

 C#で学ぶ配列の使い方メモ。基本は、ベッタベタのC言語で配列を使ってループ処理(検索とか)が自力で書ける事が前提条件。



foreach文

foreach(int index in iArray)
{ // イテレータ=indexはこの構文内で処理に使用可能
func(index);
}

 配列を参照するためにパワーアップしたfor構文。上のサンプルはint型配列と言うことになっているが、もちろんほかのオブジェクト(定義したクラス)でもOK。iArrayはint[]型の配列と言うことでお願いします。

インデクサ

(自クラスのデータ型) this[int index]
{
get;
set;
}

 インデクサは、自クラスを配列で宣言したとき、添字を使ってアクセスする際の読み(=get)・書き(=set)の挙動を定義する。自分が配列で宣言された際のアクセッサのようなもの。上下関係で言うと、配列自体がオブジェクトになって、thisが各要素になるのかな。

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

{Development][C#] インターフェース

インターフェース

public interface (インターフェース名)
{
int func1();
void func2();
}

 インターフェースは、「完全に仮想化された抽象クラス」、「メンバ変数を持たない」、「インターフェースで定義されたメソッド、アクセッサはpublicの可視性を持つ」といったところか。

 ポイントとしては、インターフェースをインスタンス宣言して、実装クラスを参照するポインタみたいな使い方ができるようになるところ。「完全に仮想化された抽象クラス」ではそれはできない(抽象クラスが持つvirtual宣言つきメソッドの実体がないという理由で怒られる)。

 抽象クラスがあればインターフェースいらないんじゃね、と正直思っていたが、使い方とかメリットがわかれば納得。

theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証
カレンダー
10 | 2019/11 | 12
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最近の記事
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
いろいろリンクボタン
埋め込みe-Words