2012-05-13 39 views
7

Tôi đang làm việc để lập trình trình phát phương tiện cơ bản và tôi gặp một số sự cố khi viết mã đa hình, đó là điều tôi đã nghiên cứu, nhưng chưa bao giờ thực sự được triển khai trước đó.Đa hình: Bắt nguồn từ một thành viên được bảo vệ trong một lớp cơ sở?

Có bốn lớp liên quan: MediaInfo, MovieInfo, Media và Movie.

MediaInfo là lớp cơ sở trừu tượng chứa thông tin liên quan đến tất cả các tệp phương tiện. MovieInfo kế thừa từ MediaInfo và thêm một số thông tin cụ thể cho tệp video.

Phương tiện là lớp cơ sở trừu tượng đại diện cho tất cả các tệp phương tiện. Phim được thừa hưởng từ Phương tiện.

Bây giờ, truyền thông bao gồm các dòng mã sau đây:

protected MediaInfo info; 

Bên Media, Tôi có Accessors đó trích xuất thông tin từ MediaInfo. Tuy nhiên, bên trong Movie, tôi muốn có Accessors cũng trích xuất thông tin từ MovieInfo.

Vì vậy, những gì tôi đã làm trong phim là:

protected MovieInfo info; 

Và bên trong constructor:

this.info = new MovieInfo(path); 

Tuy nhiên, bây giờ tôi có một accessor:

/// <summary> 
/// Gets the frame height of the movie file. 
/// </summary> 
public string FrameHeight 
{ 
    get 
    { 
     return this.info.FrameHeight; 
    } 
} 

Vấn đề là, FrameHeight là một accessor chỉ có sẵn bên trong MovieInfo. this.info được coi là một MediaInfo, mặc dù thực tế là tôi đã khai báo nó như là một MovieInfo, và do đó mã tạo ra một lỗi.

Vì vậy, để tổng hợp vấn đề của tôi thành một câu hỏi chung chung hơn: Trong một lớp dẫn xuất, làm thế nào để tôi lấy được từ một biến cơ sở được bảo vệ trong lớp cơ sở?

Xin lỗi nếu điều này có chút khó hiểu, tôi rất sẵn lòng làm rõ mọi chi tiết không rõ ràng.

Trả lời

6

Bạn có thể làm cho lớp cơ sở chung trong các loại MediaInfo nó chứa:

public abstract class Media<T> where T : MediaInfo 
{ 
    protected T info; 
} 

Sau đó, bạn có thể xác định rằng Movie xử lý MovieInfo loại:

public class Movie : Media<MovieInfo> 
{ 
    public string FrameHeight 
    { 
     get { return this.info.FrameHeight; } 
    } 
} 
+1

@Daniel - Tôi nghĩ generics là giải pháp duy nhất (loại an toàn) cho cấu trúc bạn đã cung cấp. Bạn có thể làm điều đó theo cách không chung chung nếu bạn có thể di chuyển trường 'info' ra khỏi lớp' MovieInfo' và vào các lớp con của nó. – Lee

1

Dưới đây là một lựa chọn không chung chung:

protected MovieInfo info { get { return (MovieInfo)base.info; } } 

Tùy thuộc về tình hình, điều này có thể hoặc có thể không tốt hơn giải pháp của Lee. Cá nhân tôi thích anh ấy hơn, chỉ nghĩ chung thôi.

Các vấn đề liên quan