爲什麼我不選擇抽象?聲明類成員虛擬的限制是什麼?只能將方法聲明爲虛擬嗎?何時應該將類成員聲明爲虛擬(C#)/ Overridable(VB.NET)?
回答
抽象方法或屬性(都可以是虛擬的或抽象的)只能在抽象類中聲明,並且不能有正文,即不能在抽象類中實現它。
虛擬方法或屬性必須有一個主體,即您必須提供一個實現(即使主體爲空)。
如果有人想使用你的抽象類,他將不得不實現一個繼承它的類,並顯式實現抽象方法和屬性,但可以選擇不覆蓋虛方法和屬性。
例:
using System;
using C=System.Console;
namespace Foo
{
public class Bar
{
public static void Main(string[] args)
{
myImplementationOfTest miot = new myImplementationOfTest();
miot.myVirtualMethod();
miot.myOtherVirtualMethod();
miot.myProperty = 42;
miot.myAbstractMethod();
}
}
public abstract class test
{
public abstract int myProperty
{
get;
set;
}
public abstract void myAbstractMethod();
public virtual void myVirtualMethod()
{
C.WriteLine("foo");
}
public virtual void myOtherVirtualMethod()
{
}
}
public class myImplementationOfTest : test
{
private int _foo;
public override int myProperty
{
get { return _foo; }
set { _foo = value; }
}
public override void myAbstractMethod()
{
C.WriteLine(myProperty);
}
public override void myOtherVirtualMethod()
{
C.WriteLine("bar");
}
}
}
如果你想在你的基類中給它一個實現,你可以使它成爲虛擬的,如果你不把它抽象化。
是的,只有方法可以聲明爲虛方法。
如果您不想在基類中定義任何實現並且想強制它在任何派生類中定義,那麼您會使用抽象。如果要提供可由派生類重寫的默認實現,請將其定義爲虛擬。
是的,只有方法可以是虛擬的。
摘要表示您無法提供默認實現。這又意味着所有的子類都必須提供抽象方法的實現,以便實例化(具體)。
我不確定'限制'是什麼意思,所以不能回答這個問題。
屬性可以被聲明爲虛擬的,但是你可以在概念上將它們視爲方法。
如果存在基本實現,則應該聲明一個虛擬成員,但是在子類中可能會覆蓋該功能。虛擬也可以用來代替抽象以允許方法實現是可選的(即,基本實現是空的方法)
當將成員設置爲虛擬,但虛擬成員比非虛擬成員慢時沒有限制,虛擬方法。
這兩種方法和屬性都可以標記爲虛擬。
首先,我會回答你第二個問題。只有方法可以被聲明爲虛擬的。 當你希望在你的基類中有一些默認的功能時,你會選擇虛擬而不是抽象的,但是你希望保留通過繼承你的基類的類來覆蓋這個功能的選項。 爲例子:
如果要實現的形狀類,你可能有一個名爲的getArea()返回你的形狀的面積法。在這種情況下,Shape類中的getArea()方法沒有默認行爲,因此您可以將其實現爲abstract。將方法實現爲抽象將會阻止您實例化對象的形狀對象。
在另一方面,如果實現了類狗,你可能要實現在這種情況下,方法樹皮(),你可能想實現一個默認的吠叫聲,並把它在狗類,而一些繼承類,如類Chiwawa可能想重寫此方法並實現特定的吠叫聲。在這種情況下,方法樹皮將被實現爲虛擬,您將能夠實例化狗以及Chiwawas。
有一個疑難雜症在這裏要注意的Windows窗體。
如果你想要一個可以繼承的Control/UserControl,即使你在基類中沒有邏輯,你也不希望它是抽象的,否則你將無法使用Designer中的派生類: http://www.urbanpotato.net/default.aspx/document/2001
你的問題比技術更關係到風格。我認爲,這本書 http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756 圍繞你的問題和其他很多人討論很多。
我個人將大多數方法和屬性標記爲虛擬。我使用代理和延遲加載很多,所以我不想擔心以後改變的東西。
- 1. 將指針聲明爲類成員C++
- 2. C++:將模板聲明爲類成員
- 3. 何時應該將子對象聲明爲qt中父類的成員變量?
- 4. VB.net Overridable屬性不同於C#虛擬屬性?
- 5. 爲了模擬對象,我們是否應該聲明所有成員函數是虛擬的(C++)?
- 6. C++繼承:虛擬成員需要重新聲明?
- 7. 將對象聲明爲類成員
- 8. C++聲明類成員以外的類
- 9. C++從父虛擬成員調用子虛擬成員
- 10. 私人成員應該明確聲明爲私人的慣用C#嗎?
- 11. 我應該聲明這是const int成員變量的類嗎?
- 12. 在運行時聲明類成員D
- 13. C++如何聲明對象的向量作爲類的成員
- 14. 將一個類的數組聲明爲該類的私有成員?
- 15. C++虛擬函數的前向聲明
- 16. 被聲明爲靜態類成員的C++類
- 17. 如何將unique_ptr的向量聲明爲類數據成員?
- 18. 爲什麼C++模板參數應該聲明爲類類型?
- 19. 聲明前向聲明的類的成員函數爲朋友
- 20. 在C++中模擬一個類的虛擬靜態成員?
- 21. 設置虛擬函數聲明爲零?
- 22. PHP如何聲明一個類成員?
- 23. 繼承基類成員函數的虛擬說明符
- 24. C++:重寫純虛擬成員變量?
- 25. 虛擬基類數據成員
- 26. 虛擬成員調用抽象類
- 27. 未聲明類的類成員
- 28. 爲什麼這個類沒有聲明任何純粹的虛擬成員函數abstract?
- 29. 將接口聲明爲類成員有什麼用處?
- 30. 錯誤TS1112:不能將一個類成員聲明爲可選