抽象类没有任何抽象方法

时间:2010-08-09 10:32:47

标签: c#

我很惊讶地知道C#中的抽象类是可能的,也没有抽象方法。

abstract class AbstractDemo
{
 public void show()
  {
    Console.WriteLine("In Show Method"); 
   }
}
class MainDemo:AbstractDemo
{
 public static void Main()
 {
    Console.WriteLine("In Main Method");
 }
}

任何解释?

8 个答案:

答案 0 :(得分:21)

有时您不希望提供实例化类的可能性,但您需要将此类作为其他类的基类。

在接口上选择抽象类的原因是你可以提供一些基本的实现。

答案 1 :(得分:11)

这是完全有效的,如果你想提供类似事件的行为,偶尔会有用:提供一个抽象类,其中所有“事件处理程序”都是作为虚拟方法实现的,默认行为是什么。

派生类可以覆盖方法的某些,但不必覆盖任何特定的方法,因为没有什么是抽象的。这个类仍然是抽象的,因为基类的实例是没有意义的(因为一切都是无操作的)。

这种模式在Java中比C#更常见 - 但是在C#中你通常只使用“正确的”事件。

答案 2 :(得分:2)

我认为你把抽象类与接口混淆了。接口不能有body的方法,抽象类也可以。有时您希望阻止用户实例化特定类的对象;但仍然为从它派生的类提供一些基本功能;这是抽象类有用的东西。

答案 3 :(得分:1)

抽象类是一个必须在可以使用之前进行扩展的类。这并不意味着函数本身必须是抽象的。

以动物类

为例
public abstract class Animal
{
    void Move()
    {
        //whatever
    }
}

public class Fish : Animal
{
    void Swim()
    {

    }
}

public class Dog : Animal
{
    void Bark()
    {

    }
}

所有动物都可以移动,但只有鱼可以游泳,狗可以吠叫。

或者是一个现实生活中的例子。我有一个我在我的应用程序中使用的Asp.net MVC基本控制器。它有一些我经常需要的基本方法,比如GetCurrentUser()和我写的一个帮助本地化的函数。它还负责跟踪,因此我不必在所有控制器中重写该代码。该类有大约200行代码,但没有一个抽象方法。

答案 4 :(得分:0)

如果你的类只是其他类的基础并且它没有完全的可用性 - 换句话说作为基础itselfe根本不可用,那么你想要阻止创建它的实例。在这种情况下,您可以创建没有抽象成员的抽象类。

答案 5 :(得分:0)

你可以在一个类上使用abstract关键字来告诉编译器它只能继承它,而不是直接;在这种情况下,您不会被视为将抽象成员放在课堂上。

这相当于只在一个类中放入一个受保护的构造函数,但使用抽象更清晰易懂。

答案 6 :(得分:0)

没有比MSDN更好的解释了 http://msdn.microsoft.com/en-us/library/aa645615(v=VS.71).aspx

  
      
  • 抽象类不能直接实例化,它是一个   编译时错误使用新的   抽象类的运算符。而   它有可能有变量和   编译时类型的值   抽象,这样的变量和值   必须是null或   包含对实例的引用   非抽象类派生自   抽象类型。
  •   
  • 允许(但不要求)抽象类来包含抽象   成员。
  •   
  • 无法密封抽象类。
  •   

答案 7 :(得分:0)

我们听说在抽象类中,必须有一个abstarct成员。但是当我在没有抽象方法的情况下编译abstarct类时,它会编译。这给了我惊喜。现在我无法找到解释abstarct类的确切行为的文章。