我有一個類B擴展了類A,并且它的toJson方法覆寫了類A的toJson方法。但是當我把B類強加給A類時,toJson方法沒有從B類變成A類。
class A{
String str1。
A(this.str1)。
Map<String, dynamic> toMap()=> {
'str1': str1,
}
}
class B extends A{
String str2。
B(this.str2, str1) : super(str1)。
Map<String, dynamic> toMap()=> {
'str2': str2。
'str1': str1,
}
}
void test(A a) {
print(a.toMap())。
}
//當我在類A引數中傳遞類B時,它仍然使用類B.toMap方法。
B b = B('str2', 'str1') 。
test(b)。
uj5u.com熱心網友回復:
所有的Dart實體方法都是虛擬的,也被稱為具有動態調度。這意味著當你呼叫a.toMap()時,哪個toMap實作被呼叫取決于物件a的運行時型別,而不是運算式a的靜態型別。
因此,在這種情況下,您是在B的一個實體上呼叫toMap,所以您使用B的toMap。
這是一個在面向物件語言中相當常見的行為(動態調度是面向物件的標志性特征之一。物件決定如何回應你發送給它的訊息,這里是對 "toMap "操作的請求。
一些面向物件的語言也有非虛擬的方法。Dart則沒有。 你可以定義一個靜態的方法:
class A {
static Map<String, dynamic> toMap(A value) =>...。
}
class B{
static Map<String, dynamic> toMap(B value) =>...。
}
然后選擇呼叫哪一個:
print(A.toMap(a))。
或者你可以使用擴展方法(這實際上只是靜態方法,有更好的呼叫語法),因為它們是根據接收器的靜態型別來調度的:
extension AToMap on A {
Map<String, dynamic> toMap() => ...。
}
extension BToMap on B {
Map<String, dynamic> toMap()=> ...;
}
并正常呼叫:
print(a.toMap()); //根據`a`的靜態型別選擇AToMap.toMap。
在大多數情況下,如果你真的想同時訪問A.toMap和B.toMap的一個實體,你最好重命名其中一個方法以避免命名沖突。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329152.html
標籤:
