我很惊讶地知道在C#中,即使没有抽象方法,也可以创建抽象类。
abstract class AbstractDemo
{
public void show()
{
Console.WriteLine("In Show Method");
}
}
class MainDemo:AbstractDemo
{
public static void Main()
{
Console.WriteLine("In Main Method");
}
}
有什么解释吗?
我很惊讶地知道在C#中,即使没有抽象方法,也可以创建抽象类。
abstract class AbstractDemo
{
public void show()
{
Console.WriteLine("In Show Method");
}
}
class MainDemo:AbstractDemo
{
public static void Main()
{
Console.WriteLine("In Main Method");
}
}
有什么解释吗?
这是完全有效的,有时候还很有用,如果您想提供类似事件的行为:提供一个抽象类,其中所有的“事件处理程序”都实现为虚方法,并且默认行为是什么都不做。
我个人也经常将其用于抽象远程 API 客户端类,其中所有方法都会抛出异常:它们是为了测试替身而抽象化的,期望我们的实现是唯一的生产实现,但允许用户手动创建自己的测试替身或通过模拟框架创建。将方法设置为虚方法而不是抽象方法意味着可以添加新的 RPC 而不会造成破坏性变化。
然后,派生类可以重写一些方法,但不必覆盖任何具体的方法,因为没有任何抽象内容。对于该类仍然是抽象的,因为基类的实例将是无意义的(因为一切都是空操作)。
这种模式在 Java 中比在 C# 中更常见,因为在 C# 中,您通常只需要使用“真正的”事件即可。
抽象类是必须在使用之前扩展的类。这并不意味着函数本身必须是抽象的。
以动物类为例。
public abstract class Animal
{
void Move()
{
//whatever
}
}
public class Fish : Animal
{
void Swim()
{
}
}
public class Dog : Animal
{
void Bark()
{
}
}
我认为你把抽象类和接口混淆了。接口不能有具体的方法实现,而抽象类可以。有时候你想防止用户实例化一个特定类的对象,但仍然要为派生自它的类提供一些基本功能;这就是抽象类的用处。
你可以在一个类上使用抽象关键字,仅仅是为了告诉编译器它只能被继承使用,而不能直接使用;在这种情况下,你不必在类上放置抽象成员。
这相当于在类中只放置一个受保护的构造函数,但使用抽象更清晰易懂。
没有比MSDN本身更好的解释了 http://msdn.microsoft.com/en-us/library/aa645615(v=VS.71).aspx
- 抽象类不能直接实例化,使用new运算符在抽象类上是编译时错误。虽然可能有变量和值的编译时类型是抽象的,但这些变量和值必定要么为null,要么包含对派生自抽象类型的非抽象类实例的引用。
- 允许(但不是必须)在抽象类中包含抽象成员。
- 抽象类不能被密封。