C#基础:抽象类和抽象方法实现多态以及简单工厂设计模式的语法
首先应注意一下问题:
1,抽象方法不能有方法体;例如:public abstract void Show();
2,抽象成员必须在抽象类中;
3,父类中的抽象成员子类继承以后要重写或者就是子类也是一个 抽象类
4,抽象成员不能用private的访问修饰符
5,抽象类不能被实例化(抽象类的做用就是为了让继承的)
6,抽象类中可以包含实例成员或构造函数
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
如果父类中的方法体幽默人的实现并且需要实例化那么此时用虚方法实现多态;
例如:
public class jisuanji
{
public virtual void Write()
{
Console.WriteLine("xie");//虚方法
}
public virtual void Read()
{
Console.WriteLine("du");//虚方法
}
}
class Upan : jisuanji
{
public override void Write()
{
Console.WriteLine("upan的写");//重写虚方法
}
public override void Read()
{
Console.WriteLine("upan");
}
}
如果父类中的方法体没有默认的实现并且不需要实例化那么此时可以定义为抽象类通过抽象类来实现多态;
例如:
public abstract class jisuanji
{
public abstract void Write();//这里是抽象方法
public abstract void Read();
}
class Upan : jisuanji //子类继承父类但子类是普通类不是抽象类所以要把父类里面所有的抽象成员重写
{
public override void Write()
{
Console.WriteLine("upan的写"); //重写父类中的抽象方法
}
public override void Read() {
Console.WriteLine("upan");
}
}
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
new关键字
如果父类中的一个方法在子类中加关键字new 就是全新的重写了这个方法同是把从父类中继承的这个方法给隐藏了
例如:
public class jisuanji
{
public void Write()
{
Console.WriteLine("xie");
}
}
class Upan : jisuanji
{
public new void Write()//此时就是把父类中的Write方法给隐藏了在主函数中调用子类的方法就是这个而继承的那个方法就被给隐藏了
{
Console.WriteLine("upan的写");
}
}
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
简单工厂的设计模式
例如:
public abstract class jisuanji//抽象类
{
public abstract void Write();//抽象方法
}
class Upan : jisuanji//继承抽象类
{
public override void Write()
{
Console.WriteLine("upan的写");//重写方法
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("输入内容");
string str = Console.ReadLine();
jisuanji p= Show(str);//参数传进简单工厂的方法中返回的是父类类型的对象
p.Write();//这里就是多态调用子类中的方法
Console.ReadKey();
}
static jisuanji Show(string str)//简单工厂返回的是父类的类型
{
jisuanji p = null;//抽象类不能实例化因此把null给它
switch (str)
{
case "upan"://case的值为upan的时候执行下面
p=new Upan();//这是子类的一个实例化对象
break;
}
return p;//返回的是子类的实例化对象子类可以隐式转换成父类
}
}