2010-06-06 39 views
7

Tôi có một lớp cơ sở như thế này:Có thể nhận được một tài sản được trừu tượng và các thiết lập được ảo?

public class Trajectory{ 
    public int Count { get; set; } 
    public double Initial { get; set { Count = 1; } } 
    public double Current { get; set { Count ++ ; } } 
} 

Vì vậy, tôi có mã trong lớp cơ sở, mà làm cho bộ-s ảo, nhưng get-s phải ở lại trừu tượng. Vì vậy, tôi cần một cái gì đó như thế này:

... 
public double Initial { abstract get; virtual set { Count = 1; } } 
... 

Nhưng mã này có lỗi. Toàn bộ vấn đề là thực hiện chức năng truy cập trong lớp cơ sở thay vì trong tất cả các lớp dẫn xuất. Vì vậy, làm cách nào tôi có thể tạo và thiết lập thuộc tính với các công cụ sửa đổi khác nhau?

+2

Có thể bạn nên viết các phương thức GetInitial SetInitial riêng ... – Marko

+4

Tôi đang gặp khó khăn khi hiểu được ý định đằng sau mã của bạn. Nó là cực kỳ bất thường để có một setter cho một tài sản mà bỏ qua các giá trị đầu vào được thiết lập. Nếu bạn thay đổi điều này để sử dụng các phương thức (không có giá trị đầu vào không được sử dụng để gây nhầm lẫn cho mọi thứ), thì không cần thêm một tập hợp get/virtual trừu tượng nữa. –

+0

Điểm của một setter là nó "bộ" (theo một cách nào đó) giá trị đầu vào. Cách bạn thực hiện bộ của bạn, nó là một phương pháp. – Henri

Trả lời

10

chia nó thành 2 chức năng:

public double Initial 
{ 
    get { return GetInitial(); } 
    set { SetInitial(value); } 
} 

protected virtual void SetInitial(double value) 
{ 
    Count = 1; 
} 

protected abstract double GetInitial(); 
1

Làm cho nó không trừu tượng hay ảo. Và làm cho các lĩnh vực sao lưu tư nhân. Bằng cách đó, một lớp học có nguồn gốc không thể ghi đè lên nó cũng không thể gây rối với nó.

0

Không, bạn không thể. Ít nhất tôi đã không tìm thấy một giải pháp.

Nếu thuộc tính được đánh dấu là abstract thì không phải getter và setter đều có thể có cơ quan.

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