我很惊讶地知道C#中的抽象类是可能的,也没有抽象方法。
abstract class AbstractDemo
{
public void show()
{
Console.WriteLine("In Show Method");
}
}
class MainDemo:AbstractDemo
{
public static void Main()
{
Console.WriteLine("In Main Method");
}
}
任何解释?
答案 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类的确切行为的文章。