继承
C#中,每个类只能继承一个类
virtual和override关键字
C#中,类的函数中有关键字virtual,那么它是可以被继承它的类加关键字 override 重写的,当然也可以不被重写,同样是可以使用的,但你是不能override一个没有关键字virtual的函数的。
如果一个类的函数没有加关键字virtual,那么在继承的类中也是可以改写的,只需要在函数中添加关键字new告诉程序隐藏起父类的同名函数即可,如果不加也是可以编译通过,只是会有一个warning提示。
override是告诉程序我要改写父类的方法,而new则是告诉程序隐藏起父类的方法,它们的实现是不一样的
sealed关键字:表示该类无法被继承
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Bite();
dog.Age = 10;
Console.WriteLine(dog.getAge());
dog.BiteMan();
}
}
class Animal
{
public int Age;
public virtual void Bite()
{
Console.WriteLine("animal bite");
}
public virtual int getAge()
{
return Age;
}
public void BiteMan()
{
Console.WriteLine("Animal bite man");
}
}
sealed class Dog :Animal
{
public override void Bite()
{
Console.WriteLine("dog bite");
}
public new void BiteMan()
{
Console.WriteLine(" bite man");
}
}
//无法继承
class Cat : Dog
{
}
补充的:
关于override和new关键字还有一点,如果我是用父类类型来声明一个子类的话,那么override的函数是子类的函数,而new关键字的函数是父类的函数
继承关系的实例化顺序:首先调用父类的构造函数,然后是子类的构造函数
重载:
class Program
{
static void Main(string[] args)
{
PrintHello();
Complex c1 = new Complex();
Complex c2 = new Complex();
c1.number = 2;
c2.number = 3;
Console.WriteLine((c1 + c2).number);
}
//可以传参不同重载,但不能传参一样但返回值不同
public static void PrintHello()
{
Console.WriteLine("hello world");
}
public static void PrintHello(string toWho)
{
Console.WriteLine("hello {0}", toWho);
}
}
//运算符重载
class Complex
{
public int number;
public static Complex operator +(Complex c1,Complex c2)
{
Complex c = new Complex();
c.number = c1.number + c2.number;
return c;
}
}
多态:一个形态,多个功能
静态多态:编译时候就已经知道,主要通过程序重载来实现
动态多态:只有程序具体运行时候才知道是什么功能,通过override重写达到目的
class Program
{
static void Main(string[] args)
{
Human human1 = new Man();
Human human2 = new Woman();
human1.CleanRoom();
human2.CleanRoom();
}
}
class Human
{
public virtual void CleanRoom()
{
Console.WriteLine("Human Clean Room");
}
}
class Man:Human
{
public override void CleanRoom()
{
Console.WriteLine("Man clean room slowly");
}
}
class Woman:Human
{
public override void CleanRoom()
{
Console.WriteLine("Woman clean room quickly");
}
}
}