C#封装 继承 多态

45 篇文章 0 订阅
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;

namespacelesson10
{
   enum Sex
    {
        men,women
    }
   class Person
    {
       public string name;//字段骆驼命名
       public Sex sex;
       public double Money;




       public Person() { Console.WriteLine("默认构造方法调用"); }//默认访问修饰符是私有的


       public Person(stringname, Sex sex)
        {
           this.name = name;//如果类没建对象,this等于类,如果创建对象了,this就指对象
           this.sex = sex;
        }

    }
   class Teacher: Person
    {
       public string name;//字段骆驼命名
       public Sex sex;
       public string teach;
       //public Teacher()
       //{

       //    Console.WriteLine("teachr");
       //}
       public Teacher(stringname, Sex sex, string teach):base(name,sex)//base继承父类的字段  
           //base()有参数  父类里面也必须要有有参数的构造函数
        {
           //this.name = name;
           //this.sex = sex;
           
           this.teach = teach;
        }

       public void WolkDog(Dogsl) {
           Console.WriteLine("遛狗");
        }
    }
   class Dog
    {
       public void Bark() { Console.WriteLine( "dog,bark"); }
    }
   class SmallDog: Dog
    {
       public void SmallDogBark() { Console.WriteLine( "sl,baek"); }
    }

   class BigDog: Dog
    {
       public void BigDogBark() { Console.WriteLine( "big,bark"); }
    }

   class Student : Person
{
       public Student()
        {

         
        }
       //public string name;
       //public Sex sex;
       public Teacher teacher;
       public Student( Sexsex, Teacher teacher) : base()//base()无参数  父类里面也必须要有无参数的构造函数
        {
         
           this.sex = sex;

           this.teacher = teacher;
        }



    }
   //面向对象  先找对象 
   //class Elephant
   //{

   //}
   //class IceBox
   //{
   //    public void Open() { Console.WriteLine("冰箱门打开了"); }
   //    public void Zhuang(string thing)
   //    {

   //        Console.WriteLine("把" + thing + "装进冰箱");
   //    }
   //    public void Off() { Console.WriteLine("冰箱门关上了"); }


   //}

   //class House //封装
   //{
   //    double price;//私有的
   //        string add;

   //    public string Add
   //    {
   //        get
   //        {
   //            return Add;
   //        }

   //        set
   //        {
   //            Add = value;
   //        }
   //    }

   //    public House(double price,string add) {

   //        this.price = price;
   //        this.add = add;

   //    }
   //}

   class Master
    {
       public void Exam() { Console.WriteLine( "师傅考试" ); }
    }
   class Disciple: Master
    {
       public virtual   void Exam() { Console.WriteLine("徒弟考试"); }
    }
   class Disciple5552: Disciple
    {
       public override voidExam() { Console.WriteLine("徒孙考试"); }
    }
   class Program
    {
       static void Main(string[] args)
        {
           //构造方法是与类名相同,并且无返回值,不加void;
           //作用  主要是创建对象,并给对象赋初始值
           //不带参数的构造方法称为默认构造
           //构造方法可以带有参数,可以重载
           //person 点不出来构造方法。 构造方法 只能在new对象中用       
           //如果给对象赋初始值可以在类里面写出带有参数的构造方法并使用;
           //Person person = new Person("张三",Sex.men  );
           Person s = new Person();
             优先调用无参数的构造方法,,如果在类里面没有任何对象,系统会默认一个构造 供我们使用,如果有带参数的构造的方法,
           调用默认构造时 必须显示的把默认构造写出来
           //Console.WriteLine(person.name );
           //Console.WriteLine(person .sex );
           //Teacher teacher = new Teacher("李",Sex.men ,"语文");
           //Student student = new Student("王",Sex.women ,teacher );
           //Console.WriteLine(teacher .teach );
           //Console.WriteLine(student .name );

           //IceBox a = new IceBox();
           //Elephant b = new Elephant();
           //a.Open();
           //a.Zhuang("大象");
           //a.Off();
           //a.Open();
           //a.Zhuang("白菜");
           //a.Off();
           //面向对象的三大特性

           //封装  继承 多态
           //封装  我们在创建对象时不需要外部人为的破幻对象所包含的值,此时就需要把字段给封装起来
           //具体的做法是把成员的字段用Private 来修饰,这样外部就无法拿到字段并修改所储存的数据,同时把私有的字段改成属性
           //通过属性修改字段的值,创建对象并初始化对象时,可以用带有参数的构造方法给字段赋值,
           //把字段写成私有,在外部拿不到,但是在类内部可以调用字段
           //继承  
           //被继承的称为父类,或者基类   继承的称为子类
           //当一个子类继承父类时 ,会把父类里面的成员继承过来
           //父类里面的成员用public修饰,共有的 会被继承过来,如果是private修饰,是私有的 继承过来不能用
           //共有继承过来的成员在任何地方都可以使用,私有继承过来的成员只能在父类内部使用,在类的外面不能使用,
           //protected继承过来的成员只能父类和子类里面使用类的外面不能用
           //里氏转换
           //为了在处理数据时,为了使所处理的数据类型达到统一,此时会把数据的类型统一写成父类类型
           //这样就可以把子类的对象赋值给父类;
           //里氏转换的第一个原则,把子类的对象赋值给父类,但是调用类里面的成员时只能调用父类里面的,子类里面的调不到
           //里氏转换的第二个原则,把父类的对象转换成子类,用as  在第一原则上建立的  转换不成功就是null



           //Person person = new Person();
           //Console.WriteLine(person.name );
           //Teacher teacher = new Teacher("li56+", Sex.men, "yu");
           //Student student = new Student("lilkl", Sex.women, teacher);

           Console.WriteLine(teacher.teach);
           Console.WriteLine(teacher.sex);
           Console.WriteLine(teacher.name );
           Console.WriteLine(student.name);
           Console.WriteLine(student.sex);
           Console.WriteLine(student.teacher);
           SmallDog sldog = newSmallDog();
           BigDog bigdog = newBigDog();
           //teacher.WolkDog(bigdog);
           Dog kl = new Dog();
           SmallDog klll = kl asSmallDog;
            klll.SmallDogBark();
            klll.Bark();
           //Dog dog = sldog;
           SmallDog sllll=(SmallDog )dog;//不能用强制转换
           //SmallDog sllll = dog as SmallDog;
           //sllll.Bark();
           //sllll.SmallDogBark();
           //BigDog slll = dog as BigDog;
           //bool issllll = sllll is BigDog;//判断它是不是大狗类

           //Console.WriteLine(issllll);
           //if (slll != null)//转换不成功
           //{
           //    slll.BigDogBark();
           //}

           把值类型转换为引用类型的过程称为装箱  开辟双倍空间
           把引用类型转换成值类型称为拆箱        开辟双倍空间
           //int a = 10;
           //object obj = a;//所有的类都是object的子类 
           //Console.WriteLine(obj );
           //int b=(int )obj ;

           //Disciple sasa = new Disciple();
           //Disciple5552 sa = new Disciple5552();
           //子类里面有何父类同名的方法需要在子类的方法前加new表示  用子类的方法替换父类的方法,称为方法替换
           //使用new有意隐藏继承过来的同名的方法 new void  Exam
           //sasa.Exam();//各调个的方法
           //sa.Exam();
           //Disciple sasasa = sa;
           //多态
           //1.把父类里面的方法前面加virtual
           //2.在子类同名的方法前加 override 进行重写
           //当我们把一个子类的对象赋值给对象后,该对象在调用父类里面的虚方法时,如果子类重写了该虚方法,则调用的是子类
           //里面重写后的方法,否则就调用父类的虚方法
           //sasasa.Exam();

        }
    }
}
                                                                                                                                                           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值