2016-06-30 16 views

Trả lời

22

Vâng, kể từ Aoverride so với lớp cơ sở phải có cảgetset (nếu không mã không biên dịch)

public class MyBase { 
    public virtual String A { 
    get { 
     return "getBaseA"; 
    } 
    set { 
     throw new NotSupportedException("setBaseA"); 
    } 
    } 
} 

Bây giờ bạn có hai lớp khác nhau có nguồn gốc:

public class MyDerivedA: MyBase { 
    public override String A { 
    get { 
     return "s"; 
    } 
    set { // set is overridden, now set does nothing 
    } 
    } 
} 

public class MyDerivedB: MyBase { 
    public override String A { 
    get { 
     return "s"; 
    } 
    // set is not overridden, same as in the base class 
    } 
} 

Hãy gọi cả set phương pháp:

// Does nothing: overridden MyDerivedA.A.set is called 
MyBase test1 = new MyDerivedA(); 
test1.A = "Sample"; 

// Will throw NotSupportedException (base MyBase.A.set is called) 
MyBase test2 = new MyDerivedB(); 
test2.A = "Sample"; 
+1

@CodesInChaos: Cảm ơn bạn đã gợi ý! 'NotSupportedException' thực sự là một lựa chọn tốt hơn. –

6

Người đầu tiên sẽ ghi đè thiết lập cho A trong lớp cơ sở bằng phương pháp không làm gì cả. Vì vậy, bạn có thể có A = "" nhưng nó không làm gì cả.

Phương thức khi bạn xác định trình đặt sẽ là public override TheCompilerGeneratedNameForSetterOfAInBaseClass(string value) { } và trong trường hợp thứ hai A = "" sẽ biên dịch nhưng nó sẽ gọi trình đặt lớp cơ sở là A.

1

Đầu tiên: có một setter, nhưng trong setter rằng sẽ không làm gì cả
Thứ hai: không có setter

+0

Chắc chắn có, nhưng thật dễ dàng để bỏ lỡ. Có một setter trong cả hai trường hợp. Trong trường hợp đầu tiên, lớp setter cơ sở được ghi đè (không làm gì cả), trong khi trong trường hợp thứ hai, trình setter lớp cơ sở được thừa hưởng (để làm bất cứ điều gì nó được thực hiện để làm). – Zano

4

getter và setter này là overriden. Mã này sẽ biên dịch trong cả hai trường hợp khi thực hiện x.A ="". Trong trường hợp đầu tiên, chúng tôi ghi đè thuộc tính thiết lập có nghĩa là khi bạn cố gán giá trị cho đối tượng, không có gì xảy ra. Trong trường hợp thứ hai nó sẽ sử dụng thực hiện lớp cơ sở

2

Bạn sử dụng override, vì vậy tôi giả định lớp mảnh của bạn là từ có một baseclass với một cái gì đó giống như

public virtual string A { get; set; } 

Nếu bạn chỉ ghi đè lên các getter (ví dụ thứ hai của bạn), setter gốc sẽ vẫn được sử dụng. Bạn chỉ không thấy kết quả vì nó bị ghi đè bởi ghi đè của bạn.

Khi bạn cũng ghi đè bộ đặt bằng phương thức trống, bộ đặt cơ sở sẽ không được gọi.

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