您的位置:首页 > 编程语言 > C#

C#封装 继承 多态

2017-08-18 11:46 267 查看
[align=left]usingSystem;[/align]
[align=left]usingSystem.Collections.Generic;[/align]
[align=left]usingSystem.Linq;[/align]
[align=left]usingSystem.Text;[/align]
[align=left]usingSystem.Threading.Tasks;[/align]
[align=left]
[/align]
[align=left]namespacelesson10[/align]
[align=left]{[/align]
   enum
Sex
[align=left]    {[/align]
[align=left]        men,women[/align]
[align=left]    }[/align]
   class
Person
[align=left]    {[/align]
       public
string
name;//字段骆驼命名
       public
Sex
sex;
       public
double
Money;
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
       public
Person() {
Console.WriteLine("默认构造方法调用"); }//默认访问修饰符是私有的
[align=left]
[/align]
[align=left]
[/align]
       public
Person(stringname,
Sex
sex)
[align=left]        {[/align]
[align=left]           this.name = name;//如果类没建对象,this等于类,如果创建对象了,this就指对象[/align]
[align=left]           this.sex = sex;[/align]
[align=left]        }[/align]
[align=left]
[/align]
[align=left]    }[/align]
   class
Teacher:
Person
[align=left]    {[/align]
       public
string
name;//字段骆驼命名
       public
Sex
sex;
       public
string
teach;
[align=left]       //public Teacher()[/align]
[align=left]       //{[/align]
[align=left]
[/align]
[align=left]       //    Console.WriteLine("teachr");[/align]
[align=left]       //}[/align]
       public
Teacher(stringname,
Sex
sex, string
teach):base(name,sex)//base继承父类的字段  
[align=left]           //base()有参数  父类里面也必须要有有参数的构造函数[/align]
[align=left]        {[/align]
[align=left]           //this.name = name;[/align]
[align=left]           //this.sex = sex;[/align]
[align=left]           [/align]
[align=left]           this.teach = teach;[/align]
[align=left]        }[/align]
[align=left]
[/align]
       public
void
WolkDog(Dogsl) {
[align=left]           Console.WriteLine("遛狗");[/align]
[align=left]        }[/align]
[align=left]    }[/align]
   class
Dog
[align=left]    {[/align]
       public
void
Bark() { Console.WriteLine(
"dog,bark"); }
[align=left]    }[/align]
   class
SmallDog:
Dog
[align=left]    {[/align]
       public
void
SmallDogBark() {
Console.WriteLine(
"sl,baek"); }
[align=left]    }[/align]
[align=left]
[/align]
   class
BigDog:
Dog
[align=left]    {[/align]
       public
void
BigDogBark() { Console.WriteLine(
"big,bark"); }
[align=left]    }[/align]
[align=left]
[/align]
   class
Student
: Person
[align=left]{[/align]
       public
Student()
[align=left]        {[/align]
[align=left]
[/align]
[align=left]         [/align]
[align=left]        }[/align]
[align=left]       //public string name;[/align]
[align=left]       //public Sex sex;[/align]
       public
Teacher
teacher;
       public
Student(
Sexsex,
Teacher teacher) :
base()//base()无参数  父类里面也必须要有无参数的构造函数
[align=left]        {[/align]
[align=left]         [/align]
[align=left]           this.sex = sex;[/align]
[align=left]
[/align]
[align=left]           this.teacher = teacher;[/align]
[align=left]        }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]    }[/align]
[align=left]   //面向对象  先找对象 [/align]
[align=left]   //class Elephant[/align]
[align=left]   //{[/align]
[align=left]
[/align]
[align=left]   //}[/align]
[align=left]   //class IceBox[/align]
[align=left]   //{[/align]
[align=left]   //    public void Open() { Console.WriteLine("冰箱门打开了"); }[/align]
[align=left]   //    public void Zhuang(string thing)[/align]
[align=left]   //    {[/align]
[align=left]
[/align]
[align=left]   //        Console.WriteLine("把" + thing + "装进冰箱");[/align]
[align=left]   //    }[/align]
[align=left]   //    public void Off() { Console.WriteLine("冰箱门关上了"); }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]   //}[/align]
[align=left]
[/align]
[align=left]   //class House //封装[/align]
[align=left]   //{[/align]
[align=left]   //    double price;//私有的[/align]
[align=left]   //        string add;[/align]
[align=left]
[/align]
[align=left]   //    public string Add[/align]
[align=left]   //    {[/align]
[align=left]   //        get[/align]
[align=left]   //        {[/align]
[align=left]   //            return Add;[/align]
[align=left]   //        }[/align]
[align=left]
[/align]
[align=left]   //        set[/align]
[align=left]   //        {[/align]
[align=left]   //            Add = value;[/align]
[align=left]   //        }[/align]
[align=left]   //    }[/align]
[align=left]
[/align]
[align=left]   //    public House(double price,string add) {[/align]
[align=left]
[/align]
[align=left]   //        this.price = price;[/align]
[align=left]   //        this.add = add;[/align]
[align=left]
[/align]
[align=left]   //    }[/align]
[align=left]   //}[/align]
[align=left]
[/align]
   class
Master
[align=left]    {[/align]
       public
void
Exam() { Console.WriteLine(
"师傅考试"
); }
[align=left]    }[/align]
   class
Disciple:
Master
[align=left]    {[/align]
       public
virtual
  void
Exam() { Console.WriteLine("徒弟考试");
}
[align=left]    }[/align]
   class
Disciple5552:
Disciple
[align=left]    {[/align]
       public
override
voidExam() {
Console.WriteLine("徒孙考试"); }
[align=left]    }[/align]
   class
Program
[align=left]    {[/align]
       static
void
Main(string[] args)
[align=left]        {[/align]
[align=left]           //构造方法是与类名相同,并且无返回值,不加void;[/align]
[align=left]           //作用  主要是创建对象,并给对象赋初始值[/align]
[align=left]           //不带参数的构造方法称为默认构造[/align]
[align=left]           //构造方法可以带有参数,可以重载[/align]
[align=left]           //person 点不出来构造方法。 构造方法 只能在new对象中用       [/align]
[align=left]           //如果给对象赋初始值可以在类里面写出带有参数的构造方法并使用;[/align]
[align=left]           //Person person = new Person("张三",Sex.men  );[/align]
[align=left]           ////Person s = new Person();[/align]
[align=left]           ////  优先调用无参数的构造方法,,如果在类里面没有任何对象,系统会默认一个构造 供我们使用,如果有带参数的构造的方法,[/align]
[align=left]           ////调用默认构造时 必须显示的把默认构造写出来[/align]
[align=left]           //Console.WriteLine(person.name );[/align]
[align=left]           //Console.WriteLine(person .sex );[/align]
[align=left]           //Teacher teacher = new Teacher("李",Sex.men ,"语文");[/align]
[align=left]           //Student student = new Student("王",Sex.women ,teacher );[/align]
[align=left]           //Console.WriteLine(teacher .teach );[/align]
[align=left]           //Console.WriteLine(student .name );[/align]
[align=left]
[/align]
[align=left]           //IceBox a = new IceBox();[/align]
[align=left]           //Elephant b = new Elephant();[/align]
[align=left]           //a.Open();[/align]
[align=left]           //a.Zhuang("大象");[/align]
[align=left]           //a.Off();[/align]
[align=left]           //a.Open();[/align]
[align=left]           //a.Zhuang("白菜");[/align]
[align=left]           //a.Off();[/align]
[align=left]           //面向对象的三大特性[/align]
[align=left]
[/align]
[align=left]           //封装  继承 多态[/align]
[align=left]           //封装  我们在创建对象时不需要外部人为的破幻对象所包含的值,此时就需要把字段给封装起来[/align]
[align=left]           //具体的做法是把成员的字段用Private 来修饰,这样外部就无法拿到字段并修改所储存的数据,同时把私有的字段改成属性[/align]
[align=left]           //通过属性修改字段的值,创建对象并初始化对象时,可以用带有参数的构造方法给字段赋值,[/align]
[align=left]           //把字段写成私有,在外部拿不到,但是在类内部可以调用字段[/align]
[align=left]           //继承  [/align]
[align=left]           //被继承的称为父类,或者基类   继承的称为子类[/align]
[align=left]           //当一个子类继承父类时 ,会把父类里面的成员继承过来[/align]
[align=left]           //父类里面的成员用public修饰,共有的 会被继承过来,如果是private修饰,是私有的 继承过来不能用[/align]
[align=left]           //共有继承过来的成员在任何地方都可以使用,私有继承过来的成员只能在父类内部使用,在类的外面不能使用,[/align]
[align=left]           //protected继承过来的成员只能父类和子类里面使用类的外面不能用[/align]
[align=left]           //里氏转换[/align]
[align=left]           //为了在处理数据时,为了使所处理的数据类型达到统一,此时会把数据的类型统一写成父类类型[/align]
[align=left]           //这样就可以把子类的对象赋值给父类;[/align]
[align=left]           //里氏转换的第一个原则,把子类的对象赋值给父类,但是调用类里面的成员时只能调用父类里面的,子类里面的调不到[/align]
[align=left]           //里氏转换的第二个原则,把父类的对象转换成子类,用as  在第一原则上建立的  转换不成功就是null[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]           //Person person = new Person();[/align]
[align=left]           //Console.WriteLine(person.name );[/align]
[align=left]           //Teacher teacher = new Teacher("li56+", Sex.men, "yu");[/align]
[align=left]           //////Student student = new Student("lilkl", Sex.women, teacher);[/align]
[align=left]
[/align]
[align=left]           ////Console.WriteLine(teacher.teach);[/align]
[align=left]           ////Console.WriteLine(teacher.sex);[/align]
[align=left]           ////Console.WriteLine(teacher.name );[/align]
[align=left]           ////Console.WriteLine(student.name);[/align]
[align=left]           ////Console.WriteLine(student.sex);[/align]
[align=left]           ////Console.WriteLine(student.teacher);[/align]
           SmallDog
sldog =
newSmallDog();
           BigDog
bigdog =
newBigDog();
[align=left]           //teacher.WolkDog(bigdog);[/align]
           Dog
kl =
new Dog();
           SmallDog
klll = kl
asSmallDog;
[align=left]            klll.SmallDogBark();[/align]
[align=left]            klll.Bark();[/align]
[align=left]           //Dog dog = sldog;[/align]
[align=left]           ////SmallDog sllll=(SmallDog )dog;//不能用强制转换[/align]
[align=left]           //SmallDog sllll = dog as SmallDog;[/align]
[align=left]           //sllll.Bark();[/align]
[align=left]           //sllll.SmallDogBark();[/align]
[align=left]           //BigDog slll = dog as BigDog;[/align]
[align=left]           //bool issllll = sllll is BigDog;//判断它是不是大狗类[/align]
[align=left]
[/align]
[align=left]           //Console.WriteLine(issllll);[/align]
[align=left]           //if (slll != null)//转换不成功[/align]
[align=left]           //{[/align]
[align=left]           //    slll.BigDogBark();[/align]
[align=left]           //}[/align]
[align=left]
[/align]
[align=left]           ////把值类型转换为引用类型的过程称为装箱  开辟双倍空间[/align]
[align=left]           ////把引用类型转换成值类型称为拆箱        开辟双倍空间[/align]
[align=left]           //int a = 10;[/align]
[align=left]           //object obj = a;//所有的类都是object的子类 [/align]
[align=left]           //Console.WriteLine(obj );[/align]
[align=left]           //int b=(int )obj ;[/align]
[align=left]
[/align]
[align=left]           //Disciple sasa = new Disciple();[/align]
[align=left]           //Disciple5552 sa = new Disciple5552();[/align]
[align=left]           //子类里面有何父类同名的方法需要在子类的方法前加new表示  用子类的方法替换父类的方法,称为方法替换[/align]
[align=left]           //使用new有意隐藏继承过来的同名的方法 new void  Exam[/align]
[align=left]           //sasa.Exam();//各调个的方法[/align]
[align=left]           //sa.Exam();[/align]
[align=left]           //Disciple sasasa = sa;[/align]
[align=left]           //多态[/align]
[align=left]           //1.把父类里面的方法前面加virtual[/align]
[align=left]           //2.在子类同名的方法前加 override 进行重写[/align]
[align=left]           //当我们把一个子类的对象赋值给对象后,该对象在调用父类里面的虚方法时,如果子类重写了该虚方法,则调用的是子类[/align]
[align=left]           //里面重写后的方法,否则就调用父类的虚方法[/align]
[align=left]           //sasasa.Exam();[/align]
[align=left]
[/align]
[align=left]        }[/align]
[align=left]    }[/align]
[align=left]}[/align]
                                                                                                                           
                               
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: