- PR -

親クラスで子クラスのクラス名を取得する

1
投稿者投稿内容
パンダ
ベテラン
会議室デビュー日: 2004/03/24
投稿数: 59
投稿日時: 2004-11-25 00:40
.NET(C#)で開発しています。
親クラスで子クラスのクラス名を取得したいと考えています。

(やりたい事)
・ZZZクラスを継承して3つの子クラス(AAA、BBB、CCC)を作成します。
・子クラスのコンストラクタで子クラス名を出力したい
例えば以下のようなイメージ
 public class AAA : ZZZ
 {
  public AAA()
  {
   Console.Write(this.GetType().FullName);
  }
 }
・ただ、これだと各3つのクラスのコンストラクタに同じような
 記述をする必要がある。
・なので親クラス(ZZZクラス)のコンストラクタで子クラス名
 を取得して、クラス名を表示したい
 以下のイメージでコーディングしたい
 public class ZZZ
 {
  public ZZZ()
  {
   Console.Write(派生した子クラス名);
  }
 }
 public class AAA : ZZZ
 {
  //子クラスでは何もしないけどクラス名が表示される
  public AAA(){}
 }

いろいろ調べたのですが、解決できていないのです。
上記のようなことは可能なのでしょうか?
このような考えはおかしいのでしょうか?

よろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-25 03:41
諸農です。

どういった結果を求めているのかちょっと推測しかねるのですが。

コード:
class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        ZZZ z = new ZZZ();
        z = new AAA();
        z = new BBB();
        Console.ReadLine();
    }
}

class ZZZ
{
    public ZZZ()
    {
        Console.WriteLine(this.ToString());
    }
}
class AAA:ZZZ
{
    public AAA():base(){}
}
class BBB:ZZZ
{
    public BBB():base(){}
}



こういうことでしょうか?


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
パンダ
ベテラン
会議室デビュー日: 2004/03/24
投稿数: 59
投稿日時: 2004-11-25 08:28
Jubeiさん、ありがとうございます。
子クラスを宣言する部分は
AAA a = new AAA();
BBB b = new BBB();
のようにすることが前提で実現したいのです。

そもそもこのような考えが無理なのでしょうか?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-25 08:52
諸農です。

引用:

子クラスを宣言する部分は
AAA a = new AAA();
BBB b = new BBB();
のようにすることが前提で実現したいのです。



あの。。
提示したコードですけど、試されました?
注目するところが違うような気がしますが。

あと、蛇足ですけど、継承したクラスがObject型派生であれば、
ToString()メソッドの既定の実装としてObject型の完全限定名を返しますから、
継承してコンストラクタで云々という目的が良くわからないのです。
Object.ToStringの説明を参照


コード:

class Class1
{
[STAThread]
static void Main(string[] args)
{
//変数の型を変更しました。このようにして試されましたか?
ZZZ z = new ZZZ();
AAA a = new AAA();
BBB b = new BBB();
Console.ReadLine();

Console.WriteLine(z.ToString());
Console.WriteLine(a.ToString());
Console.WriteLine(b.ToString());
Console.ReadLine();
}
}

class ZZZ
{
public ZZZ()
{
Console.WriteLine(this.ToString());
}
}
class AAA:ZZZ
{
public AAA():base(){}
}
class BBB:ZZZ
{
public BBB():base(){}
}



> そもそもこのような考えが無理なのでしょうか?

と言われている「このような考え」というのはどのような考えなんでしょうか?
具体的に説明して頂けるとコメントもしやすいと思います。

また、最初の投稿で
> いろいろ調べたのですが、解決できていないのです。
とのことですが、調べたキーワードを教えていただけるとありがたいです。

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET


[ メッセージ編集済み 編集者: Jubei 編集日時 2004-11-25 09:06 ]
パンダ
ベテラン
会議室デビュー日: 2004/03/24
投稿数: 59
投稿日時: 2004-11-25 09:34
はい。試しました。
ただ、テストする時はクラスZZZ、AAA、BBBはそれぞれ別のファイルにしました。
Class1も別ファイルにして、合計4つのファイルを作成してテストしました。
その時ZZZを継承していませんでした。

すみません。ありがとうございました。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-25 10:00
> その時ZZZを継承していませんでした。

しつこいようで申し訳ないんですが、
AAAがZZZを継承していなければ、最初に提示したコードだと
コンパイルエラーになりますよね?
どのように試されたのでしょうか?

あと、
> Class1も別ファイルにして、合計4つのファイルを作成してテストしました。
とのことですが、別のファイルで定義していることが
今回の継承の話に伴う最初に提示したコードと何か関係あるのでしょうか?

で、結局、問題は解決できたのでしょうか?

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
1

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