C#继承与多态

 继承

1.定义

(1)继承的意义:解决功能重复问题

(2)继承:一个类具有另一个类的属性和方法,这个类叫子类(派生类),另一个类叫父类(基类、超类)

继承的关键符号   :(冒号)

(3)例子

class Father
    {
        public string nose = "大鼻子";
        public void Smoking()
        {
            Console.WriteLine("烟鬼");
        }
public Father()
        {
            Console.WriteLine("我是父类");
}
}
class Son:Father
    {
        void Get()
        {
            Console.WriteLine(nose);
            Smoking();

 		   Console.WriteLine(base.nose);
base.Smoking();
        }

public Son(): base()//调用父类构造方法
        {
            Console.WriteLine("我是子类");
        }
}

2.继承的特征

(1)特征

   1子类继承了父类的属性和方法(public、protected),但是构造方法不能被继承

    2子类使用构造方法调用父类构造方法用 base()

    3创建子类对象时,系统默认先调用父类构造方法,然后再调用子类构造方法

    4子类使用父类的属性和方法用  base 关键字(public、protected)

(2) 注意

当父类有有参构造方法时,如果子类有构造方法(无参或有参),要求父类必须有一个无参构造方法。如果子类没有构造方法,父类也需要提供一个无参构造方法。如果不提供,子类构造方法会报错!

3.修饰符

public 所有对象都可以访问

private 对象本身在对象内部可以访问

protected 只有该类对象及其子类对象可以访问

internal   同一个程序集的对象可以访问;

4.重写(override)

重写:在子类和父类中,子类中的方法名称和父类方法名称相同,参数相同

重载(overload):在同一个类中,方法名称相同,参数不同(个数、类型),与返回值无关

public virtual void Eat()//虚方法
        {
            Console.WriteLine("吃白萝卜");
        }
public override void Eat()//重写方法
        {
            Console.WriteLine("吃肉");
        }

5.虚方法

在某基类中声明 virtual 并在一个或多个派生类中被重新定义的成员方法称为虚方法。

虚方法的作用就是实现多态性(Polymorphism),多态性是将接口与实现进行分离。

在基类的函数中声明关键字virtual,就可以在其派生类中通过关键字override重写该方法。重写后的virtual方法依旧是virtual方法。

当有一个定义在类中的方法需要在继承类中实现时,可以使用虚方法。

例:

class Program
{
    class A
    {
        public A()
        {
            PrintFields();
        }
        public virtual void PrintFields() { }
    }
    class B : A
    {
        int x = 1;
        int y;
 
        public B()
        {
            y = -1;
        }
 
        public override void PrintFields()
        {
            Console.WriteLine("x={0},y={1}", x, y);
        }
    }
 
    static void Main(string[] args)
    {
        new B().PrintFields();             
    }
}

运行结果:

x=1,y=0

创建B的实例,先隐式调用父类A的无参构造方法,执行PrintFields()方法,检查到是虚方法,转去检查实例类B,有重写方法,执行重写方法,输出x=1,y=0

 6、虚方法与一般方法的区别

1、写法不同

2一般方法在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死的!而虚方法在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行时期对象实例来动态判断要调用的方法。

7.继承的优点

(1)继承是在一些比较一般的类的基础上构造、建立和扩充新类的最有效的手段。(拓展新功能

(2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系

(3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性

(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性

多态

1.定义

多态what:多态是同一个行为具有多个不同表现形式或形态的能力。

多态性可以是静态的或动态的。在静态多态性中,方法的响应是在编译时发生的。在动态多态性中,方法的响应是在运行时发生的。

静态多态性:在编译时,方法和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为:方法重载运算符重载

动态多态性是通过 抽象类 和 虚方法 实现的。

2.实现多态的两要素

(1)子类重写父类方法

(2)使用父类的类型(子类转换为父类:向上转型)

class Animal
{
 	public virtual void call() {
Console.WriteLine("无声的叫唤"); 
}
}
class Dog : Animal
 {
        // new的作用是隐藏父类的同名方法
        //public new void call() { 
//Console.WriteLine("叫声:汪~汪~汪~"); 
//}  	
        public override  void call() { 
Console.WriteLine("叫声:汪~汪~汪~"); 
}
        public void smell() { 
Console.WriteLine("嗅觉相当不错!");
}
 }
clas yu
{
 static void Main(string[] args){
Animal animal = new Dog(); //向上转型 
animal.call();
}
}

3.多态的优点

1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的

可复用性。//继承 
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护

性。 //多态的真正作用

public class Shape
{
    public int X { get; private set; }
    public int Y { get; private set; }
    public int Height { get; set; }
    public int Width { get; set; }
   
    // 虚方法
    public virtual void Draw()
    {
        Console.WriteLine("执行基类的画图任务");
    }
}

class Circle : Shape
{
    public override void Draw()
    {
        base.Draw();
        Console.WriteLine("画一个圆形");
    }
}
class Rectangle : Shape
{
    public override void Draw()
    {
        base.Draw();
        Console.WriteLine("画一个长方形");
    }
}
class Triangle : Shape
{
    public override void Draw()
    {
        base.Draw();
        Console.WriteLine("画一个三角形");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Shape circle=new Circle();
        circle.Draw();
        Shape rectangle=new Rectangle();
        rectangle.Draw();
        Shape triangle=new Triangle();
        triangle.Draw();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值