属性封装和继承

面向对象技术的三个核心概念:

封装,继承,多态

昨天学习了方法封装,今天就来说说第二种封装——属性封装

 

属性是c#引入的一种语言成分,只有很少的语言支持属性。通过对属性的读和写来保护类中的域。第一种方法体身也是一种好的方式,但用属性来实现封装会更方便。

 

下面有个实例:

class Person2

    {

        privatestringname;

        privateintage;

 

        publicstringName {

            set{

               name = value;

            }

            get{

               return name;

            }

        }

 

        publicintAge {

            set{

               age = value;

            }

            get{

               return age;

            }

        }

}

 

通过上面的例子,我们可以看到如何通过属性来实现封装。属性具有两种操作get和set。Get用来返回属性域的值。Set通过value这个变量来给属性域赋值。

使用属性封装的好处是可以用一条语句操作内部数据。

 

接下来学习的是继承

 

 

“继承”是面向对象软件技术当中的一个概念。如果一个类B继承自另一个类A,就把这个B称为"A的子类",而把A称为"B的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。

子类的声明:

子类声明:父类

{

子类体

}

 

子类可以使用父类的protectedpublic可见的变量和方法。

 

C#中子类只能继承一个父类,但一个基类(父类)可以有多个直接派生类(子类)。继承是可以传递的。

基类(父类)也就是父类,也叫超类,派生类(子类)则是子类。

 

class A

    {//父类

        public void Sum(inti,int j)

        {

            int sum = i + j;

            Console.WriteLine("I am A ,my sum={0}",sum);

        }

    }

    class B : A

    {//子类

        public void Minus(inti,int j)

        {

            int minus = i - j;

           Console.WriteLine("I am B ,my minus ={0}", minus);

 

            this.Sum(3,4);        }

 

    }

    class  Test1

    {

        static voidMain(string[] args)

        {

            B b = new B();

            b.Minus(3, 4);

            Console.Read();

        }

    }

结果:I am B ,my minus=-1

 

     Iam A ,my sum = 7

 

 

 

 

当基类(父类)Sum()方法是私有时,派生类(子类)还会继承该方法吗?

经过测试,没有在B类找到该方法,那么是不是它就没有被继承呢?

其实不是的,私有成员其实已经被继承了,

但是它们却不可以被访问,因为私有成员只能被声明它们的类或结构体中才可访问,所以看上去像是没有被继承。

 

能够阻止某个类被其他类继承吗?

答案是可以的,C#提供了一个sealed 修饰符,此修饰符会阻止其他类从该类继承。

 

sealed class A

    {

        int test;

        public void Sum(inti,int j)

        {

            int sum = i + j;

           Console.WriteLine("I am A ,my sum ={0}",sum);

        }

    }

    class B : A

    {

        public void Minus(inti,int j)

        {

            int minus = i - j;

            Console.WriteLine("Iam B ,my minus ={0}", minus);

            this.Sum(3, 4);       //编译器会报错    

        }

     }

 

 

派生类(子类)(子类)隐式获得基类(父类)的除构造函数析构函数以外的所有成员

 

当基类(父类)没有构造函数,派生类(子类)也没有构造函数时,派生类(子类)新曾成员的初始化工作由其他公有函数来完成。

 

如果只有派生类(子类)定义构造函数时,只需构造派生类(子类)对象即可。对象的基类(父类)部分使用默认构造函数来自动创建。

 

当基类(父类)和派生类(子类)都定义有构造函数时,那么执行顺序会怎样呢?

 

如果基类(父类)中是没有参数的构造函数,那么他可以隐式的被派生类(子类)执行,也就是说,派生类(子类)根本不需要包含构造函数

如果基类(父类)中是没有参数的构造函数,在派生类(子类)中可以自定义有参数的构造函数

 

如果基类定义了带有参数的构造函数,那么此构造函数必须被执行,且在派生类中实现该构造函数,此时我们可以使用base关键字。

 

如果派生类的基类也是派生类,则每个派生类只需负责其直接基类的构造,不负责间接基类的构造,

并且其执行构造函数的顺序是从最上面的基类开始的,直到最后一个派生类结束。

 

欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频、U3D教程、U3D常见问题U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值