- PR -

C#の「VBのMyClass」にあたるキーワードは?

投稿者投稿内容
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2007-08-19 13:41
調べたのですが見つかりません。
「ない」との情報はあったのですが・・・

問題になることは少ないと思いますが、
次のように常に派生クラスではなく基本クラスのメソッド・プロパティを使用したい時もあると思います。
VBではMyClassキーワードで解決できますが、
C#でそのようなキーワードが用意されていなければどうしたらよいですか?

よろしくお願いします。

コード:
        static void Main() {
            //2人は同じ誕生日
            Person p = new Person("p", new DateTime(1987, 12, 31));
            Employee e = new Employee("e", new DateTime(1987, 12, 31));
            //飲酒できるのは20歳以上
            Console.WriteLine(p.CanDrink);//False
            Console.WriteLine(e.CanDrink);//True←これがおかしい
        }
        public class Person {
            public String Name;
            public DateTime BirthDay;
            public Person(String name, DateTime birthDay) {
                this.Name = name;
                this.BirthDay = birthDay;
            }

            /// <summary>
            /// AgeプロパティをBirthDayからの満年齢をあらわす数字として定義する
            /// </summary>
            public virtual Int32 Age {
                get {
                    Int32 age = DateTime.Now.Year - this.BirthDay.Year;
                    if (DateTime.Now.DayOfYear < this.BirthDay.DayOfYear) age--;
                    return age;
                }
            }
            public  Boolean CanDrink {
                get {
                    return this.Age >= 20;//VBならここでMyClass.Ageを指定できる。
                }
            }
        }
        public class Employee : Person {
            public Employee(String name, DateTime birthDay) : base(name, birthDay) { }
            /// <summary>
            /// Ageプロパティを現在の年と従業員の生まれた年の差を表す数値として定義する
            /// </summary>
            public override int Age {
                get {
                    return DateTime.Now.Year - this.BirthDay.Year;
                }
            }
     

IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-08-19 15:06
単にvirtualでないメンバを作って、それぞれのvirtualメンバからはそれ呼ぶようにすればいいのではないでしょうか。
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2007-08-19 16:17
引用:

IIJIMASさんの書き込み (2007-08-19 15:06) より:
単にvirtualでないメンバを作って、それぞれのvirtualメンバからはそれ呼ぶようにすればいいのではないでしょうか。


ちょっとよくわからなかったのですが、
派生クラス「Employee」でもCanDrinkにあたるプロパティを定義してそれを呼び出すということでしょうか?

この例では、Ageプロパティが返す値はEmployeeのほうでは大雑把に捉えるようにオーバーライドしているので、
Personのインスタンス:19
Employeeのインスタンス:20
が正しいのですが、CanDrinkは両方Falseでなければならないということです。
Emplyoee側で、オーバーライドしたAgeプロパティとは別に実年齢を求めて飲酒可能かどうかを求める
ということであれば確かに可能ですが、
無駄で悪い設計のような気がするのですが・・・

勘違いしてたらすみません。
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-08-19 16:30
すいません、わかりにくかったですね。
あらためてhei様のご提示のソースで説明します。
Ageのvirtualをとって別の名前、たとえば_Ageにして、
別のvirtualのついた、Ageプロパティを新たに作成して、そこからは単に_Ageを呼ぶだけにして、CanDrinkプロパティからも_Ageのほうを参照するということでよいのではないでしょうか。
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2007-08-19 17:01
あ、そういうことですか!
確かにいけますね。

ただこれ嵌ったら原因がわかりにくいところだと思いますし、
言語仕様としてVBのようにサポートしてほしいですね。

IIJIMASさん
ありがとうございました。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-08-19 17:30
引用:

heiさんの書き込み (2007-08-19 17:01) より:
ただこれ嵌ったら原因がわかりにくいところだと思いますし、
言語仕様としてVBのようにサポートしてほしいですね。


いらない。どころかサポートしないで欲しいな。
わかっている人しか「できない」方が混乱しないと思うな。
だからそんなことで嵌るという前提がありえない。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-08-19 18:56
定義を変えるようなオーバーライドをしちゃいかんでしょう。
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2007-08-19 19:15
Jittaさん、お世話になっています。
今読んでいるVBの本でこの例が出てきまして、
C#ではどうするのだろうと思い質問しました。

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