2009-04-20 32 views
27

Trong C# một hằng số có thể được ghi đè trong một lớp dẫn xuất không? Tôi có một nhóm các lớp được tất cả cùng một số giá trị không đổi, vì vậy tôi muốn tạo một lớp cơ sở định nghĩa tất cả các phương thức và sau đó chỉ cần thiết lập các hằng số có liên quan trong các lớp dẫn xuất. Điều này có thể không?Các hằng số ghi đè trong các lớp dẫn xuất trong C#

Tôi không chỉ chuyển các giá trị này cho hàm tạo của mỗi đối tượng vì tôi muốn thêm loại an toàn của nhiều lớp (vì nó không bao giờ có ý nghĩa đối với hai đối tượng có hằng số khác nhau để tương tác).

Trả lời

29

Rất tiếc, các hằng số không thể bị ghi đè vì chúng không phải là thành viên ảo. Các số nhận dạng không đổi trong mã của bạn được thay thế bằng các giá trị bằng chữ của trình biên dịch tại thời gian biên dịch.

Tôi khuyên bạn nên thử sử dụng thuộc tính trừu tượng hoặc ảo cho những gì bạn muốn làm. Đó là những ảo và như vậy có thể (phải, trong trường hợp một thuộc tính trừu tượng) được ghi đè trong kiểu dẫn xuất.

44

nó không phải là một hằng số nếu bạn muốn ghi đè lên nó;) thử một thuộc tính chỉ đọc ảo (hoặc setter bảo vệ) ...

Read-Only tài sản

public class MyClass { 
    public virtual string MyConst { get {return "SOMETHING"; }} 
} 
... 
public class MyDerived : MyClass { 
    public override string MyConst { get { return "SOMETHINGELSE"; }} 
}

Protected Setter

public class MyClass { 
    public string MyConst { get; protected set; } 

    public MyClass() { 
     MyConst = "SOMETHING"; 
    } 
} 

public class MyDerived : MyClass { 
    public MyDerived() { 
     MyConst = "SOMETHING ELSE"; 
    } 
}
3

Hằng số được đánh dấu bằng const không thể vì chúng được thay thế bởi trình biên dịch tại thời gian biên dịch.

Nhưng trường tĩnh thông thường được gán cho giá trị không đổi có thể. Tôi đã có một trường hợp như vậy chỉ là bây giờ:

class Columns 
    { 
     public static int MaxFactCell = 7; 
    }; 

    class Columns2 : Columns 
    { 
     static Columns2() 
     { 
      MaxFactCell = 13; 
     } 
    }; 

Nếu tôi chỉ xác định lại MaxFactCell trường trong lớp có nguồn gốc thay vào đó, đa hình sẽ không làm việc: mã sử dụng Columns2 như Columns sẽ không nhìn thấy giá trị trọng.

Nếu bạn cần hạn chế quyền ghi (nhưng không đọc) vào trường, sử dụng readonly sẽ cấm xác định lại nó trong Columns2. Làm cho nó một tài sản thay, đó là mã hơi hơn:

class Columns 
    { 
     static Columns() 
     { 
      MaxFactCell = 7; 
     }    
     public static int MaxFactCell {get; protected set;}; 
    }; 

    class Columns2 : Columns 
    { 
     static Columns2() 
     { 
      MaxFactCell = 13; 
     } 
    }; 
1

Bạn có thể ẩn di truyền liên tục trong một lớp học có nguồn gốc bằng cách tuyên bố mới liên tục new. Tôi không chắc đây là một thực hành tốt hay không.

class A 
{ 
    protected const int MyConst = 1; 
} 

class B : A 
{ 
    new private const int MyConst = 2; 
} 
+0

một Đây sẽ là một trong những tốt đẹp :) – nayanajith

1

để làm việc tắt dten + câu trả lời Tracker1 nhưng cập nhật cho C# 6

public class MyClass { 
    public virtual string MyConst =>"SOMETHING"; 
} 
... 
public class MyDerived : MyClass { 
    public override string MyConst =>"SOMETHING ELSE"; 
} 
0

Bạn có thể buộc các lớp thừa kế có giá trị cho một hằng số (tốt, một thuộc tính chỉ đọc)

  • Tạo giao diện chứa thuộc tính chỉ đọc.
  • Đặt giao diện đó trên lớp cơ sở.

Ví dụ:

public interface IHasConstant 
    { 
     string MyConst { get; } 
    } 
Các vấn đề liên quan