抽象类:
在程序中使用关键字 abstract
如果说正常类是一个完整的类的话,抽象类实际上是一个不完整的类.
抽象类的特点:
1.如果类中存在抽象方法,那么该方法不可以有实现部分.只能是方法声明.
2.含有抽象方法的类一定是抽象类.
3.抽象类不一定含有抽象方法.
4.如果子类的父类为抽象类并且含有抽象方法的话,子类必须实现重写该抽象方法.
5.virtual和abstract不能使用private修饰符,要使用public修饰符.
6.virtual不能和abstract放在一起用.
7.抽象类不能被实例化.
8.抽象类可以包含静态成员.
抽象类的作用:父类约束子类行为.
using System;
namespace OOP抽象方法
{
abstract class Person
{
//
public string name;
public static void SayHi(){
Console.WriteLine ("人类说");
}
public abstract void Say ();
public abstract void Say (string name);
}
class Huang:Person
{
public override void Say ()
{
Console.WriteLine ("子类重写父类的抽象方法并实现!~");
}
public override void Say (string name)
{
Console.WriteLine ("嘿嘿嘿");
}
}
abstract class Poor {
public abstract void Buy();
}
class Rich:Poor {
public override void Buy ()
{
Console.WriteLine ("想买就买呗!~");
}
}
class MainClass
{
public static void Main (string[] args)
{
// new Huang ().Say();
// Person.SayHi ();
//练习:有一个类,它有好几个愿望,但是他很穷,他真的没钱买.
//机缘巧合之下,他有了一个儿子,儿子很有钱.实现了他的愿望.
new Rich ().Buy ();
}
}
}
抽象类的实例:
/*
* Shap类,表示一个形状的抽象类.
* 该类包含一个求图形面积的抽象方法Area()
* 请从Shap的派生类,梯形,圆形,三角形,菱形实现各自的面积.
* 需要计算面积用到的参数,请自己想办法解决.
*
*/
using System;
namespace 抽象类练习题
{
abstract class Shap
{
public abstract double Area ();
public abstract double Area (string name);
}
class Triangle:Shap
{
int down;
int up;
int height;
public Triangle(int down,int up,int height){
this.down = down;
this.up = up;
this.height = height;
}
//实现父类抽象方法
public override double Area ()
{
return (this.down + this.up) * this.height * .5f;
}
public override double Area (string name)
{
return (this.down + this.up) * this.height * .5f;
}
}
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine (new Triangle (10, 10, 10).Area());
}
}
}
接口:接口就是公共契约.
接口的关键字: interface
接口和类属于同级关系,都属于c#中的编程单位.
接口也被称作纯洁的抽象类
接口特点:
1.不能有字段
2.接口内不能有修饰符
3.接口中不能有方法体(方法实现)
4.接口同样不可以被直接实例化
5.接口里面成员总是公共的
6.接口中可以有属性,但是不能有修饰符
7.接口中可以有索引器/事件声明
8.接口中声明的方法,子类实现的时候虽然也用override关键字,但是记住不属于重写.这里不能把
override显示的声明出来.
开发准则:尽量多用接口.
能用接口的不用抽象类,能用抽象类不用虚方法.
动态多态性.
using System;
using System.Collections;
namespace OOP接口
{
interface IInput
{
void Read();
}
interface IInputTwo
{
void Read();
}
class Test:IInput,IInputTwo
{
public string name;
//如果接口出现方法同名情况需要以下列方式实现,但是调用的时候
//要用动态多态性调用,非常规调用方式
// public void IInput.Read(){
// Console.WriteLine ("1111");
// }
//
// public void IInputTwo.Read(){
// Console.WriteLine ("2222");
// }
public void Read(){
Console.WriteLine ("1111");
}
// public void Read(){
// Console.WriteLine ("2222");
// }
public IInput T(){
Test t = new Test ();
t.name = "测试返回接口实例";
return t;
}
}
class MainClass
{
public static void Main (string[] args)
{
// new Test ().Read ();
//返回接口实例
Test t = new Test();
Console.WriteLine (t.name);
Test t1 = (Test)t.T ();
Console.WriteLine (t1.name);
// Test t = new Test ();
}
}
}