Cách tốt nhất để khởi tạo các hằng số hoặc các trường khác trong các lớp kế thừa là gì? Tôi nhận ra có nhiều lỗi cú pháp trong ví dụ này, nhưng đây là ví dụ tốt nhất để giải thích rõ ràng những gì tôi đang cố gắng làm.Khởi tạo các trường trong các lớp kế thừa
public abstract class Animal {
public abstract const string Name; // #1
public abstract const bool CanFly;
public abstract double Price; // price is not const, because it can be modified
public void Fly() {
if (!CanFly)
Debug.Writeln("{0}s can't fly.", Name);
else
Debug.Writeln("The {0} flew.", Name);
}
}
public class Dog : Animal {
public override const string Name = "Dog"; // #2
public override const bool CanFly = false;
public override double Price = 320.0;
}
public class Bird : Animal {
public override const string Name = "Bird";
public override const bool CanFly = true;
public override double Price = 43.0;
}
Một vài điều tôi đang cố gắng để hoàn thành:
- lớp cơ sở phải gán những 3 lĩnh vực.
- Lý tưởng nhất là tôi muốn các trường được khởi tạo này ở cùng nhau ở đầu lớp để tôi có thể xem các hằng số nào được gán cho mỗi lớp và thay đổi chúng bất cứ khi nào cần.
- Các trường Tên và CanFly không thể thay đổi.
Tôi biết rằng bạn có thể khởi tạo các trường này trong một hàm tạo (nếu bạn loại bỏ const), nhưng sau đó chúng không được đảm bảo được chỉ định. Nếu bạn có các trường này dưới dạng thuộc tính thay thế và ghi đè chúng, bạn vẫn cần phải khởi tạo trường sao lưu của thuộc tính. Làm thế nào bạn sẽ thực hiện điều này?
Một vài lỗi cú pháp nó than phiền về:
- Các modifier 'trừu tượng' không hợp lệ trên các lĩnh vực. Thay vào đó, hãy thử sử dụng thuộc tính. (# 1)
- Một lĩnh vực const đòi hỏi một giá trị được cung cấp (# 1)
- Các modifier 'đè' không hợp lệ cho mặt hàng này (# 2)
Tôi nghĩ bạn hiểu nhầm những hằng số là gì. Hằng số là giá trị không bao giờ thay đổi trong suốt lịch sử vũ trụ; do đó, tên "hằng số". Ví dụ tốt về hằng số: số trứng trong một tá, số nguyên tử chì. Xấu: số phiên bản của ứng dụng của bạn; điều này thay đổi theo thời gian. Khủng khiếp: giá của một thùng dầu; thay đổi sau vài giây. Nếu có một trường có giá trị có thể thay đổi trong suốt thời gian tồn tại của ứng dụng, nó không phải là hằng số. –
Cảm ơn lời giải thích. Tôi đoán tôi là một chút bối rối bởi vì các lĩnh vực Dog.Name và Dog.CanFly không bao giờ nên được thay đổi, do đó tôi sẽ nghĩ rằng họ nên được hằng số. Tuy nhiên, các trường Animal.Name và Animal.CanFly sẽ được thay đổi bởi các lớp kế thừa, vì vậy chúng không phải là hằng số. Tôi đã cố gắng để xác định chúng như là hằng số trong các lớp thừa hưởng chỉ, mà tôi đoán bạn không thể làm. – Senseful
Để lập mô hình một giá trị được đặt một lần vào thời gian xây dựng và không bao giờ thay đổi sau đó, hãy sử dụng trường chỉ đọc. Các trường chỉ đọc có thể là các trường thể hiện, trong trường hợp này bạn có thể có một giá trị khác nhau cho từng cá thể hoặc tĩnh, trong trường hợp đó, mỗi cá thể đều có cùng giá trị. –