Sự khác biệt giữa việc triển khai hai thuộc tính này là gì?Rỗng setter vs không setter trong bất động sản
public override string A
{
get { return "s"; }
set { }
}
public override string A
{
get { return "s"; }
}
Sự khác biệt giữa việc triển khai hai thuộc tính này là gì?Rỗng setter vs không setter trong bất động sản
public override string A
{
get { return "s"; }
set { }
}
public override string A
{
get { return "s"; }
}
Vâng, kể từ A
là override
so với lớp cơ sở phải có cảget
và set
(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";
@CodesInChaos: Cảm ơn bạn đã gợi ý! 'NotSupportedException' thực sự là một lựa chọn tốt hơn. –
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
.
Đầ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
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
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ở
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.
Hãy thử 'A =" ";' và xem điều gì xảy ra. –