2008-09-17 40 views

回答

10

抽象方法或属性(都可以是虚拟的或抽象的)只能在抽象类中声明,并且不能有正文,即不能在抽象类中实现它。

虚拟方法或属性必须有一个主体,即您必须提供一个实现(即使主体为空)。

如果有人想使用你的抽象类,他将不得不实现一个继承它的类,并显式实现抽象方法和属性,但可以选择不覆盖虚方法和属性。

例:

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"); 
     } 
    } 
} 
0

如果你想在你的基类中给它一个实现,你可以使它成为虚拟的,如果你不把它抽象化。

是的,只有方法可以声明为虚方法。

3

如果您不想在基类中定义任何实现并且想强制它在任何派生类中定义,那么您会使用抽象。如果要提供可由派生类重写的默认实现,请将其定义为虚拟。

是的,只有方法可以是虚拟的。

0

摘要表示您无法提供默认实现。这又意味着所有的子类都必须提供抽象方法的实现,以便实例化(具体)。

我不确定'限制'是什么意思,所以不能回答这个问题。

属性可以被声明为虚拟的,但是你可以在概念上将它们视为方法。

2

如果存在基本实现,则应该声明一个虚拟成员,但是在子类中可能会覆盖该功能。虚拟也可以用来代替抽象以允许方法实现是可选的(即,基本实现是空的方法)

当将成员设置为虚拟,但虚拟成员比非虚拟成员慢时没有限制,虚拟方法。

这两种方法和属性都可以标记为虚拟。

0

首先,我会回答你第二个问题。只有方法可以被声明为虚拟的。 当你希望在你的基类中有一些默认的功能时,你会选择虚拟而不是抽象的,但是你希望保留通过继承你的基类的类来覆盖这个功能的选项。 为例子:

如果要实现的形状类,你可能有一个名为的getArea()返回你的形状的面积法。在这种情况下,Shape类中的getArea()方法没有默认行为,因此您可以将其实现为abstract。将方法实现为抽象将会阻止您实例化对象的形状对象。

在另一方面,如果实现了类,你可能要实现在这种情况下,方法树皮(),你可能想实现一个默认的吠叫声,并把它在类,而一些继承类,如类Chiwawa可能想重写此方法并实现特定的吠叫声。在这种情况下,方法树皮将被实现为虚拟,您将能够实例化狗以及Chiwawas。

1

有一个疑难杂症在这里要注意的Windows窗体。

如果你想要一个可以继承的Control/UserControl,即使你在基类中没有逻辑,你也不希望它是抽象的,否则你将无法使用Designer中的派生类: http://www.urbanpotato.net/default.aspx/document/2001

0

我个人将大多数方法和属性标记为虚拟。我使用代理和延迟加载很多,所以我不想担心以后改变的东西。

相关问题