2009-07-10 49 views
5

OK vì vậy tôi thừa nhận ngay trên đầu rằng điều này hơi khó hiểu ... nhưng nó phục vụ một mục đích hợp lý. Tôi đang sử dụng C# cho một dự án hiện tại và tôi đang cố gắng tìm cách ghi đè biến thành viên trong một lớp dẫn xuất, nhưng truy cập biến được ghi đè trong một phương thức lớp cơ sở. Để làm cho mọi thứ trở nên “giải trí” tốt hơn nếu biến thành viên bị ghi đè là tĩnh (điều này KHÔNG được hiển thị trong mã ví dụ bên dưới).C# Ghi đè biến thành viên được sử dụng bởi phương pháp lớp cơ sở

Đây là mẫu mã của tôi:

class baseclass 
{ 
    protected string[] array = null; 

    public string method() 
    { 
     string str = ""; 
     foreach (string x in this.array) 
     { 
      str += x + " "; 
     } 

     return str; 
    } 
} 

class subclass1 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class1value1", 
     "class1value2", 
     "class1value3", 
     "class1value4" 
    }; 
} 

class subclass2 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class2value1", 
     "class2value2", 
     "class2value3", 
     "class2value4" 
    }; 
} 

Bất kỳ suy nghĩ là tại sao điều này không làm việc và là một cách để có được xung quanh nó?

+1

Biến thành viên không đa hình như phương pháp. Khởi tạo mảng để chứa các giá trị mong muốn trong mỗi lớp con. –

Trả lời

8

Có lý do nào khiến bạn không thể sử dụng thuộc tính ảo không? Điều đó sẽ cung cấp chính xác chức năng bạn đang tìm kiếm. Nó sẽ không phải là một lĩnh vực.

protected abstract string[] array { get; } 

...

protected override string[] array { get { return new string[]{"...","..."}; }} 
+0

Tôi đang chơi xung quanh với điều này ngay bây giờ ... bạn nói đúng điều này có thể hoạt động ... vẫn chơi để chắc chắn. Cảm ơn bạn đã tự tin hơn trong suy nghĩ của mình. –

1

Tại sao bạn cần ghi đè biến? Nhìn từ mã của bạn, chỉ cần thiết lập các giá trị là đủ, phải không?

Ngoài ra, các biến tĩnh được liên kết với lớp học (không phải trường hợp), do đó, không thể ghi đè lên bất kỳ tình huống nào.

+0

bạn đang tạo lớp riêng biệt chỉ để giữ các dữ liệu khác nhau, +1 –

1

Đơn giản chỉ cần không sử dụng mới. Đặt mảng trong hàm tạo của lớp con của bạn.

EDIT: với mã:

class subclass1 : baseclass 
{ 
    public subclass1() 
    { 
     array = new string[] 
     { 
      "class1value1", 
      "class1value2", 
      "class1value3", 
      "class1value4" 
     }; 
    } 
} 

class subclass2 : baseclass 
{ 
    public subclass2() 
    { 
     array = new string[] 
     { 
      "class2value1", 
      "class2value2", 
      "class2value3", 
      "class2value4" 
     }; 
    } 
} 
+0

điều này sẽ không cho phép tôi có một mảng tĩnh –

1
class BaseClass 
{ 
    public virtual string Method() 
    { 
     return string.Empty; 
    } 
} 

abstract class BaseClass<T> : BaseClass where T : BaseClass<T> 
{ 
    protected static string[] strings; 

    public override string Method() 
    { 
     return string.Join(" ", strings); 
    } 
} 

class Subclass1 : BaseClass<Subclass1> 
{ 
    static Subclass1() 
    { 
     strings = new[] { "class1value1", "class1value2", "class1value3" }; 
    } 
} 

class Subclass2 : BaseClass<Subclass2> 
{ 
    static Subclass2() 
    { 
     strings = new[] { "class2value1", "class2value2", "class2value3" }; 
    } 
} 

Phần quan trọng là tham số chung T mà về cơ bản có chức năng như một chỉ số để các mảng chuỗi.

1

Bạn đang cố gắng để có được hành vi đa hình từ mảng nhưng bạn đang xác định hành vi đó cho hành vi cục bộ của lớp.

Mảng có phải là ảo hoặc phương pháp() trong lớp cơ sở sẽ lập luôn truy cập vào mảng trong lớp cơ sở - mảng cũng phải là một tài sản không phải là một lĩnh vực để làm điều này, ví dụ,

string [] _array = {...};/Các giá trị cục bộ của lớp cơ sở chuỗi ảo được bảo vệ [] mảng {get {return _array; }} // làm cho bất động sản mảng overridable

sau đó trong lớp con, bạn sẽ cần phải làm

string [] _array = {...}; // subclass local values ​​ chuỗi ảo [] mảng {get {return _array; }} // điều này ghi đè thuộc tính lớp cơ sở

để có được ảnh hưởng mong muốn

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