0

私は次のものを持っています:

class Info
{
    public string str;
};

class CarInfo : Info {}

class InfoContainer
{
    public virtual List<Info> info_list {get; set;}
    public bool is_known(Info inf)
    {
        if (-1 == info_list.FindIndex( i => i.str == inf.str) return false;
        return true;
    }  
}

class CarFleetInfo : InfoContainer
{
     new public List<CarInfo> info_list;
     CarFleetInfo()
     {
         info_list = new List<CarInfo>();
     }
}


Main()
{
    CarInfo c = new CarInfo();
    Info i = new Info();
    c.is_known(i);
}

Info(のような CarInfo) から継承した他の「特定の情報」クラスはほとんどありInfoContainerませんinfo_list

これで、 nullc.is_known(i)という例外を発生させる呼び出しが行われました。info_list

4

6 に答える 6

0

info_listプロパティをオーバーライドしているのではなく、シャドウイングしています。

プロパティをオーバーライドするには、overrideキーワードの代わりにキーワードを使用する必要があります。そうすればnew、コードは意図したとおりに機能します。

プロパティをシャドウすると、サブクラスは同じ名前の独自のプロパティを取得しますが、基本クラスは何も知りません。

于 2013-08-22T18:06:25.063 に答える
0

2 つの問題があります。

  1. シャドウイングではなくオーバーライドする必要があります
  2. 異なるシグネチャを持つメソッドをオーバーライドすることはできません

    class Info { パブリック文字列 str; };

    class CarInfo : Info {}
    
    class InfoContainer
    {
        public virtual List<Info> info_list {get; set;}
        public bool is_known(Info inf)
        {
          if (!info_list.Exists(p => p.str == inf.str)) return false;
          return true;
         }
    }
    
    class CarFleetInfo : InfoContainer
    {
         public override List<Info> info_list { get; set; }
    
         CarFleetInfo()
         {
            info_list = new List<Info>();
         }
    }
    

List<CarInfo>public override publicを持つことはできませんList<Info>

于 2013-08-22T18:09:38.420 に答える