2009-04-07 32 views
9

Nếu tôi có một lớp cơ sở và hai lớp dẫn xuất, và tôi muốn thực hiện việc đúc giữa hai lớp dẫn xuất bằng tay, có cách nào để làm điều đó không? (trong C#)Overriding (cast)

abstract class AbsBase 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
} 

class Imp_A : AbsBase 
{ 
    private List<int> E; 
} 


class Imp_B : AbsBase 
{ 
    private int lastE; 
} 

Nói chung tôi sẽ được truyền từ Imp_A -> Imp_B và tôi muốn giá trị cuối cùng trong danh sách E là 'LastE'. Ngoài ra, điều gì sẽ xảy ra nếu có ba hoặc nhiều lớp triển khai (như Mức lương, Hàng giờ, Tư vấn và Nhân viên cũ.)

Bất kể đây là âm thanh kiến ​​trúc (tôi không thể mô tả toàn bộ ứng dụng và súc tích) là nó có thể?

Tôi sẽ viết một trình biến đổi, ngoại trừ việc hiểu được một trình biến đổi sẽ tạo ra một đối tượng mới của lớp Imp_B mà tôi không cần vì 'nhân viên' sẽ chỉ là một trong các tùy chọn thời gian.

-Devin

Trả lời

19

Bạn phải triển khai toán tử explicit hoặc implicit.

class Imp_A : AbsBase 
{ 
    public static explicit operator Imp_B(Imp_A a) 
    { 
     Imp_B b = new Imp_B(); 

     // Do things with b 

     return b; 
    } 
} 

Bây giờ bạn có thể làm như sau.

Imp_A a = new Imp_A(); 
Imp_B b = (Imp_B) a; 
+1

Hãy nhớ rằng điều này sẽ (rõ ràng) thực sự tạo ra một đối tượng Imp_B hoàn toàn mới. – mquander

+0

Điều đó thật hoàn hảo. Nhưng, như mquander đề cập, đó là một đối tượng mới, mà tôi tin là không thể tránh khỏi. Nhưng điều này có nghĩa rằng "a" sẽ không được GC'd cho đến khi nó rơi ra khỏi phạm vi, mặc dù tôi không bao giờ sử dụng nó một lần nữa (như là một Imp_A)? – DevinB

+0

Có, nó sẽ chỉ được thu thập nếu nó rơi ra khỏi phạm vi và bạn không còn giữ bất kỳ tham chiếu đến nó. –

2

tôi muốn đề nghị bạn viết Imp_B như thế này, nếu có thể:

class Imp_B : Imp_A 
{ 
    private int A; 
    private int B; 
    private int C; 
    private int D; 
    private int lastE { get { return this.E.Last(); } } 
} 

Nếu bạn không thể thực sự bắt nguồn từ ImpB, nó không thể để bạn có thể "xử lý" một IMPA đối tượng như một ImpB một cách minh bạch theo cách bạn muốn, bởi vì họ không phải là điều tương tự trong bộ nhớ. Vì vậy, hãy triển khai chuyển đổi rõ ràng.

+0

xin lỗi, bạn nói đúng, tôi sẽ xóa A-D – DevinB

+0

Ngoài ra, các lớp này sẽ phức tạp hơn, với các biến nhất định dành riêng cho từng biến. Và sau đó một số biến nhất định (như E) có liên quan trực tiếp, nhưng không nhất thiết phải giống nhau. – DevinB