2013-07-01 4 views
0

부모로 불리는 경우 자식 클래스의 방법을 수행하고, 클래스 클래스 B. 클래스 B는 클래스 A의 하위되도록 :내가 클래스 클래스 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; 
    } 
    ... 
} 

:

그래서 나는 B의 개체가 목록 Xlist 저장 모든으로와 B에, 예를 들어 A라고한다하지만 코드의 여러 장소에서 액세스 될 때마다 getAData()를 호출하는 방법을 찾고 있어요

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); 
      ... 
      ... 
     } 
    } 

위의 인스턴스에서 나는 객체가 Xlist에서 꺼내 졌을 때 A와 같이 계급을 얻고 싶을 때마다 자동으로 getAData() 함수를 호출하고 결과 대신 A를 반환합니다. 이것이 가능한가??

+0

너무 많은 정보로부터 말하기는 너무 어렵지만, 상속은 나빠질 것 같습니다. @ evanmcdonnal의 대답은 현재 감옥에서 빠져 나올 것입니다. 하지만 나는 B가 A (집계) 또는 여하튼 위임을 위임하는 것보다 A가 있음을보고있을 것입니다. 현재 도로를 내려 가면 갈수록 디자인이 악화됩니다. A는 자손에서 오버라이드 할 수도 있고하지 않을 수도있는 가상 메소드를 수행하지 않는 대중을 종결시킬 것입니다. –

답변

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; 

위의 예는 상속이 작동하는 방식의 예입니다. 기본 클래스의 인스턴스를 검색하지 않습니다. 기본 클래스에있는 모든 것은 파생 클래스의 인스턴스로 구워집니다. 파생 클래스가 구성하는 다른 객체가 기본 클래스처럼 작동하고 있습니다.

+0

나는 당신이 질문을 이해한다고 생각하지 않는다. 클래스 A는 내가 부르길 원하는 함수를 가지고 있지 않다. 클래스 B는 그렇게한다. 클래스 B의 객체가 A로 호출 될 때마다 자동으로 함수를 수행하고 내부 인스턴스를 반환하려고합니다. – DarthSheldon

+0

@DarthSheldon 상속이 어떻게 작동하는지 혼란스러워합니다. 왜 유형 B는 유형 A에서 상속 받았으며 유형 A의 인스턴스로 구성됩니까? 그 관계는 의미가 없습니다. B 유형의 인스턴스에는 A 유형의 인스턴스에 더 많은 플러스가있는 모든 특성/메소드가 있다는 것을 알고 있습니까? 예를 들어'A []'가 있고 그 객체와 상호 작용할 때'B' 형의 객체를 가지고 있다면 호출 코드는 그것들이'B 형 '이라는 것을 모릅니다. 유형의 속성/메소드 만 'A'가 드러납니다. – evanmcdonnal

+0

그래 맞아, 어쩌면 내가 방금 두 번 끔찍한 (날 놀라게하지 않을 것입니다) 설명했는데 내 개체 B가 A처럼 행동하기를 원한다. 유일한 문제는 B가 압축 파일을 포함하고 A는 압축을 푼 파일.그래서 A는 파일 정보에 대한 액세스 권한이 있습니다. B는 누군가 Zip 파일의 데이터에 액세스 할 수 있도록 unziped 파일 (따라서 B 클래스)과 비슷한 방식으로 데이터베이스에 기록되어야합니다. A가 아니라 B가 호출 될 때를 알 수 있도록 파일을 압축 해제해야 함 2. 파일에 A를 작성하고 B를 새 A로 바꾸기 – 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(); 
    } 
} 
관련 문제