我有一個抽象類,它實作了一個抽象方法,它作為其子項中某個值的 getter 的占位符:
public abstract class MyAbstractClass {
public abstract int GetMyValue();
}
public class MyChildClass0 : MyAbstractClass {
int myValue = 1;
public override int GetMyValue {
return myValue;
}
}
public class MyChildClass1 : MyAbstractClass {
int myValue = 7;
public override int GetMyValue {
return myValue;
}
如您所見,getter 在每個孩子中的行為方式都相同。我的問題是是否有任何方法可以使該 getter 成為非抽象方法,所以我只需要在抽象類中實作一次。每次我想在任何子類中訪問 myValue 時,我只需呼叫它從 MyAbstractClass 繼承的 GetMyValue 方法。
我不知道該怎么做,因為我不知道如何讓 getter 訪問該欄位,因為它不是在抽象類中宣告的,而是在子類中宣告的。
uj5u.com熱心網友回復:
屬性和默認建構式在這里是一件很棒的事情。
這會強制所有派生類為MyAbstractClass.
public abstract class MyAbstractClass {
protected MyAbstractClass(int myValue)
{
MyValue = myValue;
}
public int MyValue { get; }
}
uj5u.com熱心網友回復:
在您的特定情況下,您想要一個與實作類緊密耦合的 int,但公開只讀,但如果有人忘記MyValue在類上設定并且值在類級別,而不是建構式級別(創建類實體的東西不能設定/修改類MyValue,它是類固有的)
以下將起作用:
public abstract class MyAbstractClass {
public abstract int MyValue { get; }
}
public class MyChildClass0 : MyAbstractClass {
// C#6 I believe added this handy shorthand for Getter Properties
public override int MyValue => 1;
}
public class MyChildClass1 : MyAbstractClass {
// This is the same as above
public override int MyValue {
get => 7;
}
}
編譯器會在編譯之前糾纏你并要求MyValue在你的實作具體類上實作,這是理想的,因為這會強制它被設定。
uj5u.com熱心網友回復:
既然GetMyValue總是會回傳myValue,為什么你不能直接myValue進入抽象類?
像這樣的東西:
public abstract class MyAbstractClass {
int myValue;
public int GetMyValue() {
return myValue;
}
// If you want to change myValue you could also create a setter
public int SetMyValue(int myValue) {
this.myValue = myValue;
}
}
public class MyChildClass0 : MyAbstractClass {
public MyChildClass() {
// In constructor you can call a setter to update your value
SetMyValue(1);
// Or you could mark myValue as a protected field so
// that MyAbstractClass children had access to it.
// Then you could just directly assign a value to it
}
}
public class MyChildClass1 : MyAbstractClass {
public MyChildClass1() {
SetMyValue(7);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/470025.html
