2011-12-09 34 views
55

Tôi có lớp này Base:Tôi có thể ghi đè thuộc tính trong C# không? Làm sao?

abstract class Base 
{ 
    public int x 
    { 
    get { throw new NotImplementedException(); } 
    } 
} 

Và hậu duệ sau:

class Derived : Base 
{ 
    public int x 
    { 
    get { //Actual Implementaion } 
    } 
} 

Khi tôi biên soạn tôi nhận được cảnh báo này nói rằng định nghĩa nguồn gốc lớp của x là phiên bản sẽ hide cơ sở của nó. Có thể ghi đè các thuộc tính trong C# như các phương thức không?

Trả lời

75

Bạn cần phải sử dụng virtual từ khóa

abstract class Base 
{ 
    // use virtual keyword 
    public virtual int x 
    { 
    get { throw new NotImplementedException(); } 
    } 
} 

hoặc xác định một đặc tính trừu tượng:

abstract class Base 
{ 
    // use abstract keyword 
    public abstract int x { get; } 
} 

và sử dụng override từ khóa khi ở trẻ em:

abstract class Derived : Base 
{ 
    // use override keyword 
    public override int x { get { ... } } 
} 

Nếu bạn KHÔNG ghi đè, bạn có thể sử dụng từ khóa new trên tôi để ẩn định nghĩa của cha mẹ.

abstract class Derived : Base 
{ 
    // use override keyword 
    public new int x { get { ... } } 
} 
11

Làm cho thuộc tính cơ sở trừu tượng và ghi đè hoặc sử dụng từ khóa mới trong lớp dẫn xuất.

abstract class Base 
{ 
    public abstract int x { get; } 
} 

class Derived : Base 
{ 
    public override int x 
    { 
    get { //Actual Implementaion } 
    } 
} 

Hoặc

abstract class Base 
{ 
    public int x { get; } 
} 

class Derived : Base 
{ 
    public new int x 
    { 
    get { //Actual Implementaion } 
    } 
} 
+1

Hoặc bạn có thể sử dụng ảo trên lớp cơ sở, như Jeffrey Zhao đã đề cập. – jrummell

3

Thay đổi chữ ký bất động sản như hình dưới đây:

class Base

public virtual int x 
{ get { /* throw here*/ } } 

nguồn gốc lớp

public override int x 
{ get { /*overriden logic*/ } } 

Nếu bạn không cần thực hiện bất kỳ trong lớp Cơ sở, chỉ cần sử dụng thuộc tính trừu tượng.

Base:

public abstract int x { get; } 

Xuất phát:

public override int x { ... } 

tôi sẽ đề nghị bạn sử dụng abstract tài sản chứ không phải là trhowing ngoại lệ NotImplemented trong getter, abstact sửa đổi sẽ buộc tất cả các lớp thừa kế để thực hiện tài sản này vì vậy bạn sẽ kết thúc với giải pháp an toàn thời gian biên dịch.

2
abstract class Base 
{ 

    public virtual int x 
    { 
    get { throw new NotImplementedException(); } 
    } 
} 

hoặc

abstract class Base 
{ 
    // use abstract keyword 
    public abstract int x 
    { 
    get; 
    } 
} 

Trong cả hai trường hợp bạn phải viết trong lớp có nguồn gốc

public override int x 
    { 
    get { your code here... } 
    } 

khác biệt giữa hai là với trừu tượng bạn buộc các lớp được thừa kế để thực hiện một cái gì đó, và với virtaul bạn có thể cung cấp một hành vi mặc định mà các deriver có thể sử dụng như là, hoặc thay đổi.

3
abstract class Base 
{ 
    // use abstract keyword 
    public virtual int x 
    { 
    get { throw new NotImplementedException(); } 
    } 
} 
Các vấn đề liên quan