Tôi có một lớp cơ sở trừu tượng và tôi muốn khai báo một trường hoặc một thuộc tính sẽ có một giá trị khác nhau trong mỗi lớp kế thừa từ lớp cha này.
Tôi muốn định nghĩa nó trong lớp cơ sở để tôi có thể tham chiếu nó trong một phương thức lớp cơ sở - ví dụ ghi đè ToString để nói "Đối tượng này thuộc loại / trường thuộc tính ". Tôi đã có ba cách mà tôi có thể thấy khi làm điều này, nhưng tôi đã tự hỏi - cách tốt nhất hoặc được chấp nhận để làm điều này là gì? Newbie câu hỏi, xin lỗi.
Tùy chọn 1:
Sử dụng một Thuộc tính trừu tượng và ghi đè lên các lớp được kế thừa. Lợi ích này từ việc được thi hành (bạn phải ghi đè lên nó) và nó sạch sẽ. Nhưng, cảm thấy hơi sai khi trả về giá trị mã cứng thay vì đóng gói một trường và đó là một vài dòng mã thay vì chỉ. Tôi cũng phải khai báo một cơ thể cho "tập hợp" nhưng điều đó ít quan trọng hơn (và có lẽ có một cách để tránh điều mà tôi không biết).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Tùy chọn 2
Tôi có thể khai báo trường công khai (hoặc trường được bảo vệ) và ghi đè rõ ràng vào lớp được kế thừa. Ví dụ dưới đây sẽ cho tôi một cảnh báo để sử dụng "mới" và tôi có thể làm điều đó, nhưng nó cảm thấy sai và nó phá vỡ tính đa hình, đó là toàn bộ vấn đề. Có vẻ như không phải là một ý tưởng tốt ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Tùy chọn 3
Tôi có thể sử dụng trường được bảo vệ và đặt giá trị trong hàm tạo. Điều này có vẻ khá gọn gàng nhưng phụ thuộc vào tôi đảm bảo rằng hàm tạo luôn đặt điều này và với nhiều hàm tạo quá tải, luôn có khả năng một số đường dẫn mã sẽ không đặt giá trị.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
Đó là một câu hỏi lý thuyết và tôi đoán câu trả lời phải là tùy chọn 1 vì đây là lựa chọn an toàn duy nhất nhưng tôi chỉ nắm bắt được C # và muốn hỏi người này có nhiều kinh nghiệm hơn.