0

クラス クラス A とクラス クラス B があります。クラス B はクラス A の子であるため、次のようになります。

public class Class A
{
   public DateTime FileStart
   {
      get
      {
          return Header.StartTime;
      }
      set{ }
   }
   ...
   ...
}

public class B : A
{
   FileInfo zippedA;
   public A myA = null;
   internal B(FileInfo mFileInfo)
   {
      ...
      //collects the same data as A from the fileinfo such as  start time...
      ...
   }
   public A getAData()
   {
      UnZipFile(zippedA);
      return myA;
   }
   ...
}

getAData()そのため、オブジェクトが呼び出されるたびBに呼び出す方法を探していますA。たとえば、リスト Xlist にはすべての As と B が格納されますが、コード内のいくつかの場所からアクセスされます。

   SortedList Xlist = new SortedList();
   public void GetFrames(DateTime desiredStartTime, DateTime  desiredEndTime)
   {
       for(int fileIdx = Xlist.Values.Count-1; fileIdx >= 0; --fileIdx)
       {
           //my hope is that there is a way to set up B in it's class to say
           // "if I get called as an A, I'll perform getAData() and return myA instead.
           A rec = (A)Xlist.GetByIndex(fileIdx);
           ...
           ...
       }
   }

上記の例では、オブジェクトが B であるが A のようにカーストを取得する場合、オブジェクトが Xlist からプルされるたびに、getAData()関数を自動的に呼び出し、その結果の A を返します。これは可能ですか??

4

2 に答える 2

1

親クラスでメソッドを作成virtualし、子クラスでオーバーライドできます。これを行うと、型 A のインスタンスでメソッドを呼び出すと、派生型が提供およびオーバーライドする場合は派生型のメソッドが呼び出され、それ以外の場合は型 A のバージョンが呼び出されます。

これは最も簡単な方法ですが、別の方法はあまり魅力的ではありません。C# の仮想メソッドの詳細については、この msdn 記事を参照してください。http://msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx

自分がやりたいと思っていることを実行するには (実際にやりたいことではないことは確かです)、これを行うことができます。

   for(int fileIdx = Xlist.Values.Count-1; fileIdx >= 0; --fileIdx)
   {
       A rec = (A)Xlist.GetByIndex(fileIdx);
       if (rec.GetType() == typeof(B))
       {
            B temp = (B) rec;
            rec = temp.getAData();
       }
   } 

繰り返しますが、これはまったく意味がありません。以下に例を示します。

public class Car
{
     int year;
     bool manual;
}

public class Porsche : Car
{
    bool specialPorscheOnlyFeature;
    Engine enginge;
}

public class Engine
{
   string engineType;
} 
// in some method

Porsche p = new Porsche();
// to get Car data
int yearOfCar = p.year; 
bool isManual = p.manual;
bool specialFeature = p.SpecialPorscheOnlyFeature;

上記は、継承がどのように機能するかの例です。基本クラスのインスタンスは取得しません。基本クラスが持つすべてのものが派生クラスのインスタンスに焼き付けられます。基本クラスが派生クラスを構成する他のオブジェクトであるかのように振る舞っています。

于 2013-07-01T21:45:34.340 に答える