C# 面向对象特性 封装 继承 多态

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bayinglong/article/details/72552883

封装

将方法细节隐藏,只留名字。

Public:所有对象都可以访问;
Private:对象本身在对象内部可以访问;
Protected:只有该类对象及其子类对象可以访问
Internal:同一个程序集的对象可以访问;
Protected internal:一个程序集内的对象,或者该类对象及其子类可以访问;
以上是常用的封装的特性修饰符;其作用主要是决定外部能否对这个封装(对象)进行操作;



继承

将已有的东西(方法,字段……)进行复制粘贴,减少代码量。
正式点讲就是 ,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类(父类),这个新的类被称为派生类(子类)。

号外

  • IS–A基于类继承或接口实现,IS-A是表达这句话的一种方式:“这个东西是那个东西的一种”。例如:野马是一种马。(是一个)
    HAS-A关系是基于用法(即引用)而不是继承。换句话说,如果类A中的代码具有对类B实例的引用,则“类A HAS-A类B”。例如:马有缰绳。(有一个)

  • “is-a”代表的是类之间的继承关系,比如PC机是计算机,工作站也是计算机。PC机和工作站是两种不同类型的计算机,但都继承了计算机的共同特性。因此在用Java语言实现时,应该将PC机和工作站定义成两种类,均继承计算机类。
    “has -a”代表的是对象和它的成员的从属关系。同一种类的对象,通过它们的属性的不同值来区别。比如一台PC机的操作系统是Windows,另一台PC机的操作系统是Linux。操作系统是PC机的一个成员变量,根据这一成员变量的不同值,可以区分不同的PC机对象。

什么可以继承

类(只能一个),接口(可以多个,不好理解接口,就暂时理解成准备给很多类使用的抽象类)。
被sealed(密封)修饰符修饰的类是无法继承的。

多态

说实话,这个就是继承的实际用途了,实现动态多态;
实现的多态其实分为两种,一种是静态多态,种是动态多态;

静态多态

简单,就两种方式

  • 方法的重载

class example
      void print(int i)
      {
         Console.WriteLine("Printing int: {0}", i );
      }
      void print(double f)//**相同类;相同名字;不同参数;**
      {
         Console.WriteLine("Printing float: {0}" , f);
      }

  • 符号的重载

public static example operator+(example a,example b)
{
    example c= new example();
    c.length = b.length + c.length;
    c.breadth = b.breadth + c.breadth;
    c.height = b.height + c.height;
    return box;
}

动态多态

关键字 :virtual(虚方法),abstract(抽象类),new(隐藏方法)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace shuclass
{
    class A
    {
        public A()
        {
            Console.WriteLine("我是A类的无参构造函数");
        }

        public A(int i = 0)
        {
            Console.WriteLine("我是A类的第一个有参构造器");
            Console.WriteLine(i);
        }
        public virtual void bad()
        {
            Console.WriteLine("baaaaaaaaaaaad");
        }

        public void yes()
        {
            Console.WriteLine("yeeeeeeeeeeeees");
        }
    }

    class B : A
    {
        public B()
           // : base(333)
        {
            Console.WriteLine("我是B类的构造函数");
        }

        public B(int i)
            : base(i)    //用:base(i)调用父类中的有参构造函数  
        {
            Console.WriteLine("我是类B的第一个有参构造器");
        }
        public void Good()
        {
            Console.WriteLine("goo00000000000000000000000000d");
        }

        public override void bad()
        {
            base.bad();
            Console.WriteLine("beeeeeeeeeeeeeeeeeeeeeeeeeeeeeeed");
        }
        new public void yes()
        {
            Console.WriteLine("NOOOOOOOOOOOOOOOOO");
        }



    }

    class Test
    {
        static void Main()
        {
            A b = new B();
            b.bad();
            b.yes();
            // b.Good();//无法调用
            Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            B b1 = new B(1);
            b1.Good();
            Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            A a = new A();
            A c = b1;
            c.yes();


        }
    }

}

复制到console工程文件
F11试试看,花一个小时,相信你能理解的。

猜你喜欢

转载自blog.csdn.net/bayinglong/article/details/72552883