您的位置:首页 > 其它

抽象类与抽象方法

2015-12-29 13:34 148 查看
总结:

///<summary>
///包含抽象方法的类必须是抽象类
///反过来,如果一个类被标记为抽象类(作为父类而言),其内也必须包含抽象的方法或属性(索引器和事件没有试,理论应该也是可以)。对于子类抽象类而言,其内就可有可无
///</summary>
abstractpublicclassSuper
{
abstractpublicvoidA();

//抽象类中也可以包含非抽象方法,或者说,抽象类可有自己的实现,这是抽象类与接口的一个最大的区别!
publicvoidMethod()
{
Console.WriteLine("Super.Method()");
}
}

///<summary>
///情景1:子类是非抽象类
///</summary>
publicclassDerivedA:Super
{
//子类是非抽象类时,父类中的抽象方法必须在子类中实现(重写)
publicoverridevoidA()
{
Console.WriteLine("DevicedA.A()");
}
}

///<summary>
///情景2:子类是抽象类
///</summary>
abstractpublicclassDerivedB:Super
{
//子类是抽象类时,父类中的抽象方法,可实现,也可不实现
//publicoverridevoidA()
//{
//Console.WriteLine("DevicedB.A()");
//}

//子类是抽象类时,子类内部可有也可没有抽象方法
abstractpublicvoidB();
}

///<summary>
///DerivedC只是演示必须实现所有继承过来的抽象方法(这么描述是否恰当?),缺少任意一个实现都会报编译错误
///</summary>
publicclassDerivedC:DerivedB
{
publicoverridevoidA()
{
Console.WriteLine("DevicedC.A()");
}
publicoverridevoidB()
{
Console.WriteLine("DevicedC.B()");
}
}

interfaceI
{
voidM();
}

//抽象类必须为所有接口成员提供实现
abstractpublicclassDerivdeD:I
{
//实现接口的抽象类可以将接口方法映射到抽象方法上
publicabstractvoidM();
}


第二部分:知识点详解

MSDN说明,https://msdn.microsoft.com/zh-cn/library/sf985hc5

abstract修饰符指示所修饰的内容缺少实现或未完全实现。abstract修饰符可用于类、方法、属性、索引器和事件。在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

抽象类具有以下特性:

抽象类不能实例化。

抽象类可以包含抽象方法和抽象访问器。

不能用sealed修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用sealed修饰符的类无法继承,而abstract修饰符要求对类进行继承。

从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。

abstractclassShapesClass
{
abstractpublicintArea();
}
classSquare:ShapesClass
{
intside=0;

publicSquare(intn)
{
side=n;
}
//Areamethodisrequiredtoavoid
//acompile-timeerror.
publicoverrideintArea()
{
returnside*side;
}

staticvoidMain()
{
Squaresq=newSquare(12);
Console.WriteLine("Areaofthesquare={0}",sq.Area());
}

interfaceI
{
voidM();
}
abstractclassC:I
{
publicabstractvoidM();
}

}
//Output:Areaofthesquare=144


在方法或属性声明中使用abstract修饰符以指示方法或属性不包含实现。

抽象方法具有以下特性:

抽象方法是隐式的虚方法。

只允许在抽象类中使用抽象方法声明。

因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号({})。例如

publicabstractvoidMyMethod();


实现由一个重写方法override提供,此重写方法是非抽象类的一个成员。

在抽象方法声明中使用static或virtual修饰符是错误的。

除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。

在静态属性上使用abstract修饰符是错误的。

在派生类中,通过包括使用override修饰符的属性声明,可以重写抽象的继承属性。

抽象类必须为所有接口成员提供实现。

实现接口的抽象类可以将接口方法映射到抽象方法上。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: