除了一個事實,即A.MyMethod
是靜態的,這顯然不會因爲任何靜態不參與繼承工作,即使你做它不是靜態的它仍然是行不通的。例如,這也不起作用:
public abstract class A {
public string MyMethod() {
return "a";
}
}
public class B<T> where T : A {
public void AnotherMethod() {
var S1 = base.MyMethod(); // Line 1
var S2 = T.MyMethod(); // Line 2
}
}
爲什麼?
您的意思是where T : A
這意味着類型T
必須是來自A
的派生類型。您的課程B<T
不是派生類型A
,因此第1行將不起作用。
但爲什麼2號線不工作?
T
是一種類型,如果T
是繼承A
,然後T
類型的對象就可以做到這一點。如果你改變了它這個樣子,那麼它會工作:
public abstract class A {
public string MyMethod() {
return "a";
}
}
public class B<T> where T : A {
public void AnotherMethod(T t) {
t.MyMethod();
}
}
public class C : A {
}
public class BClosed : B<C> {
public void Foo(C c) {
c.MyMethod();
this.AnotherMethod(c);
}
}
在上面的代碼,C
派生A
這是你的限制。然後BClosed
關閉通用類型說T
是C
所以現在你可以撥打電話MyMethod
A
和AnotherMethod
你的通用。
此外,當你有一個泛型類,你應該使用泛型類型,否則我沒有看到使用。所以這是沒用的,因爲它沒有通用的代碼:
public class B<T> where T : A {
public void AnotherMethod() {
}
}
在C#中,靜態方法調用總是在編譯時靜態解析。靜態方法不參與繼承。 – recursive
爲什麼'var S2 = A.MyMethod();',因爲你知道上面的'A'? –
'基地。MyMethod()'不會工作,因爲B不會繼承A,它的類型參數僅限於A的實現,這是遞歸註釋的來源。 – Phaeze