2013-07-01 38 views
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存儲所有作爲和燒烤,但會從代碼的幾個地方訪問:

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中的對象是從的Xlist拉,但得到種姓作爲一個像這樣的時間

,它會自動調用getAData()功能並返回結果的,而不是它的自我。這可能嗎??

+0

從這麼多的信息來說太難說了,但是繼承似乎是不好的方法。現在,@ evanmcdonnal的回答將讓你擺脫監獄。但我會看B有一個A而不是A(聚合)或委託解壓縮。你走的路越遠,設計越糟糕。 A會結束大量虛無的虛擬方法,你可能會或可能不會在後代覆蓋。 –

回答

1

您可以在父類virtual中創建該方法,並在子類中重寫該方法。在這樣做的任何地方,如果派生類型提供並覆蓋,它將調用派生類型的方法,否則它將調用類型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; 

上面是一個如何繼承的例子。我不檢索基類的實例,基類的所有內容都被烘焙到派生類的實例中。你的行爲就像基類是派生類組成的其他對象一樣。

+0

我不認爲你理解這個問題,A類沒有我想要調用的功能,B類沒有。任何時候B類的對象被稱爲A我希望它自動執行它的函數並返回它的內部實例A – DarthSheldon

+0

@DarthSheldon似乎你對繼承的工作方式感到困惑。爲什麼類型B會繼承類型A並且由類型A的實例組成?這種關係沒有意義。你知道類型B的一個實例具有類型A的一個實例加上更多的所有屬性/方法,對嗎?如果你有例如'A []',並且當它與這些對象交互時,它有''B''類型的對象,調用代碼不知道它們是'B'類型,只有類型的屬性/方法'A'暴露。 – evanmcdonnal

+0

是的,這是有道理的,也許我剛剛連續兩次解釋這個可怕的(不會讓我感到驚訝),但我希望我的對象B像A一樣行動,唯一的問題是B包含一個壓縮文件,而A包含一個解壓縮文件。所以A有權訪問文件信息,B沒有,爲了讓別人訪問壓縮文件的數據,它必須以與非壓縮文件類似的方式記錄到數據庫中(因此B類),但我需要能夠告訴B什麼時候被調用,而不是A,所以我知道我必須1.unzip文件,2.爲文件做一個A,並且3.用新的A代替B – DarthSheldon

0

這可能不是最好的方法,但這不行?

class File 
{ 
    public string FileInfo = ""; 

    public override string ToString() 
    { 
     return FileInfo; 
    } 

    public virtual File GetRaw() 
    { 
     return this; 
    } 
} 

class ZippedFile : File 
{ 
    public File Unzip() 
    { 
     // Do actual unzip here.. 
     return new File { FileInfo = FileInfo.Substring(0,8) }; 
    } 

    public override File GetRaw() 
    { 
     return Unzip(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<object> files = new List<object>(); 

     files.Add(new File { FileInfo = "BeepBoop" }); 
     files.Add(new ZippedFile { FileInfo = "BeepBoopfQAWEFRLQER:LKAR:LWEasdfw;lekfrqW:ELR" }); 
     files.Add(new File { FileInfo = "BoopBeep" }); 
     files.Add(new ZippedFile { FileInfo = "BoopBeepAWSLF:KQWE:LRKsdf;lKWEFL:KQwefkla;sdfkqwe" }); 

     foreach(var f in files) 
     { 
      File rawFile = ((File)f).GetRaw(); 
      Console.WriteLine(rawFile); 
     } 

     Console.ReadKey(); 
    } 
} 
相關問題