こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#でクラス継承について

下記のようなコードは、可能なのでしょうか?

// クラス定義
abstract class Base
{
int a;

Public int A
{
get{
return a;
}
}
}

class Sub1 : Base
{
int b;

public int B
{
set
{
b = value;
}
}
};

class Sub2 : Base
{
// 中略
}


static class Program
{
[STAThread]
static void Main(string [] args)
{
Base aaa = new Sub1();
Base bbb = new Sub2();

func(aaa); // ここでCS1502, CS1503
func(bbb); // ここでCS1502, CS1503
}

void func(Sub1 _aaa)
{
// 中略
}

void func(Sub2 _bbb)
{
// 中略
}
}


コメントに書いたとおり、CS1502(引数が合わない)が出ます。

func((Sub1)aaa); の様にキャストしないと、動作させることは難しいでしょうか?


※ 実際のコードでは、func(aaa), func(bbb)の呼び出し部分をループでまわしたいと考えています。

投稿日時 - 2011-01-02 23:00:36

QNo.6421523

困ってます

質問者が選んだベストアンサー

aaaとbbbはあくまでもBase型なので、func(Base)が呼び出されます。

>func(aaa), func(bbb)の呼び出し部分をループで…
OOPでは一般的に、多態性を使ったコードで実装します。
コード自体を改変出来るのであれば、慣用的な実装の方が良いと思います。

abstract class Base {
public abstract void func(){}
}
class Sub1 : Base {
public override void func(){ ... }
}
class Sub2 : Base {
public override void func(){ ... }
}

Base aaa = new Sub1();
Base bbb = new Sub2();
aaa.func();
bbb.func();

投稿日時 - 2011-01-03 00:06:51

お礼

オブジェクト指向をちょっと勘違いしていたようです
ご回答ありがとうございました。

投稿日時 - 2011-02-12 09:54:40

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

私も、Sub1.func()、Sub2.func() を実装する方法が良いのでは、と思いますが・・・、
ご質問のような記述は、可能なことは可能です。
(無理やり感は否めませんが)

static void Main(string [] args)
{
Base aaa = new Sub1();
Base bbb = new Sub2();

func(aaa);
func(bbb);
}

private void func(Base b)
{
if (b is Sub1)
{
func((Sub1)b);
}
if (b is Sub2)
{
func((Sub2)b);
}
}

これなら、ループの中ではキャストしなくて済みます。

投稿日時 - 2011-01-03 04:27:00

お礼

ご回答ありがとうございました。

投稿日時 - 2011-02-12 09:55:13