C#,继承的使用 - Angel's Blog.

ing
 
 
软件开发,程序设计,前端设计
 
 
首页 > code > C#,继承的使用

C#,继承的使用

 

1)继承:

有相同的属性和方法:

如同人们所讲的“财产继承”,同理,被继承的类称为“父类”,继承的类称为“子类”(派生类)。

demo:

 

------------------------父类 start-----------------------------
public class Person
    {
        public Person() { }
        public Person(int age , Genders gender , string name)
        {
            this.Age = age;
            this.Gender = Genders.Male;
            this.Name = name;
        }
        protected int _Age;
        protected Genders _Gender;
        protected string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }

        public Genders Gender
        {
            get { return _Gender; }
            set { _Gender = value; }
        }

        public int Age
        {
            get { return _Age; }
            set { _Age = value; }
        }
        public enum Genders
        {
            Male , Female
        }

        public string HelloMan()
        {
            string message = string.Format("年龄{0},性别{1},名字{2}" 
, this.Age , this.Gender , this.Name);
            return message;
        }
------------------------父类 end-----------------------------

 

-----------------------Student 子类 start--------------------
    public class Student:Person//继承Person
    {
        //字段(额外加了两个字段)
        private string _Hobby;

        public string Hobby
        {
            get { return _Hobby; }
            set { _Hobby = value; }
        }
        //构造函数
        public Student() { }//默认
        public Student(int age, Genders gender, string name, string hobby)//参数
        {
            //继承父类的三个属性:Age , Gender , Name
            this.Age = age;
            this.Gender = gender;
            this.Name = name;

            //Student类自定义的属性
            this.Hobby = hobby;
        }

        //方法(返回值string)
        public string Greet()
        {
            string message = string.Format("此学生的年龄{0},性别{1},名字{2},爱好{3}。" 
, this.Age , this.Gender , this.Name , this.Hobby);
            return message;
        }
-----------------------Student 子类 end--------------------

 

-----------------------Teacher 子类 start--------------------
    public class Teacher:Person//子类Teacher继承父类Person
    {
        public Teacher() { }
        public Teacher(int age, Genders gender, string name, int workYear, int earnMoney)
        {
            //继承自父类的属性
            this.Age = age;
            this.Gender = Genders.Male;
            this.Name = name;
            //Teacher类自定义的属性
            this.WorkYear = workYear;
            this.EarnMoney = earnMoney;
        }
        private int _EarnMoney;
        private int _WorkYear;

        public int WorkYear
        {
            get { return _WorkYear; }
            set { _WorkYear = value; }
        }

        public int EarnMoney
        {
            get { return _EarnMoney; }
            set { _EarnMoney = value; }
        }
        public string Greet()
        {
            string message = string.Format("姓名{0},性别{1},年龄{2},工作年限{3},月薪{4}" ,
                this.Name , this.Gender , this.Age , this.WorkYear , this.EarnMoney);
            return message;
        }
    }
-----------------------Teacher 子类 end--------------------

分别使用btn1和btn2创建对象,调用方法:

 

        private void button1_Click(object sender, EventArgs e)
        {
            Student students = new Student(22, Person.Genders.Male, 
"王力(这个百家姓很河蟹)" , "睡觉");
            MessageBox.Show(students.Greet());
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Teacher tea = new Teacher(28, Person.Genders.Female, "王sir", 5, 2500);
            MessageBox.Show(tea.Greet());
        }

btn1(Student)和btn2(Teacher)调用的结果:

 

其中,继承要符合 is – a 的关系,也就是说,Teacher is a Person ,

Student is a Person(子类 is a 父类)。

 

2)protected访问修饰符,base关键字的使用:

 

、protected:

和“private”、“public”不同的是,C#中还提供一个访问修饰符“protected”;

由protected修饰符的子类,允许其(子类)访问,其他的类则不允许。

修饰符 类内部访问 子类 其他类
public 允许 允许 允许
private 允许 不允许 不允许
protected 允许 允许 不允许

 

、base关键字:

在子类中,可以使用base关键字调用父类的属性、方法,甚至调用父类的构造函数,所以之前的代码可以

修改为下:

demo1:

 

//修改了Student类的构造函数,使用base关键字。
----------------Student类 start------------------------
..之前的代码省略
 //构造函数
        public Student() { }//默认
        //public Student(int age, Genders gender, string name, string hobby)//参数
        //{
        //    //继承父类的三个属性:Age , Gender , Name
        //    this.Age = age;
        //    this.Gender = gender;
        //    this.Name = name;

        //    //Student类自定义的属性
        //    this.Hobby = hobby;
        //}
        public Student(int age, Genders gender, string name, string hobby)
            : base(age, gender, name)//使用base调用父类的构造函数,显示调用
        {
            //继承父类的三个属性:Age , Gender , Name
            //this.Age = age;
            //this.Gender = gender;
            //this.Name = name;

            //Student类自定义的属性
            this.Hobby = hobby;
        }
..之后的代码省略
----------------Student类 end------------------------

效果同第一个demo。

 

其中,base(参) 调用父类的属性。

方法体中,可以this.访问,也可以base.访问成员。

 

3)继承的特性:

、传递性:

譬如父类支持传递子类,子类支持传递孙子类,孙子类可以调用父类的属性和方法。

譬如class A:B; Class B:C; A类则可以访问C类中的成员

现在咱来拿一个控制台程序来演示demo:

demo2:

 

public class Grandfather
    {
        public void GrandfatherLaugh()
        {
            Console.WriteLine("爷爷在大笑");
        }
    }
    public class Father:Grandfather
    {
        public void FatherLaugh()
        {
            Console.WriteLine("老爸在笑");
        }
    }
    public class Son:Father
    {
        public void SonLaugh()
        {
            Console.WriteLine("儿子在笑");
        }
    }
    public class Program
    {
        static void Main(string[] args)
        {
            Son son = new Son();
            son.GrandfatherLaugh();//调用父类的方法
            son.FatherLaugh();//调用父类的子类的方法
            son.SonLaugh();//调用父类下的子类的子类的方法,也就是new了son对象本身的方法。
            Console.ReadLine();

        }
    }

 

、单根性:

单根性,也就是所谓的只能有一个父类,一个子类不能继承多个父类,如果一个子类能继承多个父类,可

以使用“接口”来实现,实现多重继承(之后的博文会介绍接口的实现)。

 

、密封类(sealed):

这个用的不是很多,使用“sealed”修饰的类不能被继承。

4)使用子类构造函数应当注意:

 

、隐式调用父类的构造函数:

如果子类在使用构造函数的时候没有使用base关键字,没有说明调父类的哪个构造函数,父类必须有一个

无参的默认构造函数;一般这种情况下,子类会隐式调用父类的默认构造函数(无参)。

一般这种情况会出现:

“”没有采用“0”个参数的重载。

、显式调用父类的构造函数:

相反地,父类如果没有默认构造,那么子类必须指明调用父类的哪个带有参数的构造(函数):

:base(参数)

5)为什么要继承:

、继承对于面向对象编程有很好的思考方式。

、继承能减少代码的冗余,代码的重新利用,继承机制起到了很好的作用。

、继承的结构清晰。

 

或者通过RSS 关注本站的更新 ^ O ^ 。” —  by  转载请注明:来自 Angel's Blog.
本文永久链接: http://www.0ee.com/2010/11/26/c-sharp-inherit.html
 
分类: code标签: , ,
 
  • QQ书签
  • Del.icio.us
  • 百度收藏
  • Google
  • 饭否
  • FriendFeed
 

 
评论 (10) Trackbacks (0)
发表评论 Trackback
 
10 Comments Contributed by Visitors
  1.     云在天边 2010年11月27日15:23 1#

    分页还没css啊

  2.     刘星的博客 2010年11月26日16:26 2#

    只一反三,程序就需要这样

  3.     Solo 2010年11月26日19:31 3#

    面向对象,封装,继承。好抽象。

  4.     Angel 2010年11月26日23:20 4#

    @刘星的博客
    恩,是的,display demo还是很好理解的。 ok

  5.     Angel 2010年11月27日08:35 5#

    @uninux
    恩,欢迎常来,嘿嘿。 ok

  6.     Angel 2010年11月26日23:21 6#

    @Solo
    嘿嘿,还好吧,这东西接触时间长了,不懂都懂了。 ok

  7.     vastar 2010年11月27日08:05 7#

    佩服angel的敬业精神~
    不过还是期待适当时候写写自己啊哈

  8.     Angel 2010年11月27日08:22 8#

    @vastar
    恩,嘿嘿,谢谢支持哈,主要是自己对这些东西非常感兴趣;
    以后我也会写一些关于我的生活琐碎的,嘿嘿。 ok

  9.     uninux 2010年11月27日08:30 9#

    来试一下我的gravatar。哈哈。

  10.     Angel 2010年11月28日01:48 10#

    @云在天边
    已经ok了,呵呵。 ok

Leave Comments Here...

:) :-D :( :-o 8-O :-? 8) lol :-x :-P oops cry evil twisted wink ? idea :-| arrow mrgreen roll !

(required)

(required)

网址随您("http://"可以省略)

(Ctrl+Enter)

  • 本站不会泄露您的 Email 地址, 敬请放心.
  • 本站已开启缓存, 请不要重复提交评论.
  • 请注意: 带有 《广告(链)、不健康、或者 产品名字》 的评论一律视为spam.
  • 支持常用 HTML 标签调用, 插入 HTML 标签需注意: < == &lt;> == &gt;.
  • 仅当某人针对您的评论做出回应时, 您才会收到由本站发出的邮件通知.
  • 如您希望以相同方式通知某位网友, 请点击  按钮进行回复.
  • 允许在评论中使用如下代码: 
    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> 
    <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> 
    .
  • 鼠标悬浮到评论中的 @someone 区域即可自动显示 someone 的评论内容.
 
 
  • 正在加载...