面向对象基础(继承类,抽象方法,接口,委托和事件)

1.页面上实现猫叫,狗叫,虎叫

<asp:Button ID="cat" runat="server" Text="猫叫" onclick="cat_Click" /><br/>
<asp:Button ID="dog" runat="server" Text="狗叫" onclick="dog_Click" /><br/>
<asp:Button ID="tiger" runat="server" Text="虎叫" onclick="tiger_Click" /><br/>
<asp:Button ID="shout" runat="server" Text="轮流叫" onclick="shout_Click" /><br/>
<asp:Button ID="change" runat="server" Text="实现了接口" onclick="change_Click" />

2.先实现猫叫,不用任何设计模式,定义一个猫的类(CCat)

无面向对象设计

 public class CCat
    {
        public string Name = string.Empty;//公用
        private int _numb=1;//私有
        public CCat(string name) //构造函数
        {
            this.Name = name;
        }

        public CCat()//2个函数重载,参数个数或者参数类型不一样都能重载
        {
            this.Name = "无名";
        }

        public int Numb //叫几次
        {
            get { return _numb; }//可读
            set {_numb = value<=3 ? value :3 ;} //可赋值
        }
       public string Shout()
       {
           string result = "";
           for (int i = 0; i < _numb; i++)
           {
               result += "喵!";
           }
           return "我叫" + Name +result;
        }
    }

页面上使用这个方法

protected void cat_Click(object sender, EventArgs e)
        {
            CCat cat=new CCat("小猫");
            cat.Numb = 5;
            Response.Write(cat.Shout());
        }

3.使用继承关系,猫狗还有老虎都是属于动物,所以定义一个动物类,Animal,猫狗虎都有构造函数和叫声这个方法,所以定义动物类

抽象类继承

 abstract class Animal //abstract表示是抽象方法,anmial就是抽象类了,抽象类不能实例化,要被子类重写,不然就没意义了
    {
        protected string Name = "";//protected 可以被子类用,其他类不能用

        protected Animal()
        {
            this.Name = "无名";
        }

        protected Animal(string name)
        {
            this.Name = name;
        }

        protected int _numb = 1;
        public int Numb
        {
            get { return _numb; }
            set { _numb = value; }
        }

        //public virtual string Shout()//构建虚方法 virtual
        //{
        //    return "";
        //}
        #region 重构 把shout方法放到父类,getshout()虚写方法,只为得到是谁
        public string Shout()//增加了override表示方法重写
        {
            string result = "";
            for (int i = 0; i < _numb; i++)
            {
                result += GetShout()+",";
            }
            return "我叫" + Name + result;
        }

        public abstract string GetShout();//抽象方法

        #endregion
    }

  

class CDog: Animal //继承父类 猫和狗都是动物
    {
        public CDog()//base()关键字代表父类
        {

        }
        public CDog(string name): base(name)
        {

        }
        public override string GetShout()//增加了override表示方法重写
        {
            return "汪!";
        }   }

  

  protected void dog_Click(object sender, EventArgs e)
        {
            CDog dog = new CDog("小狗");
            dog.Numb = 5;
            Response.Write(dog.Shout());
        }

  

3.实现接口猫狗老虎都是地上跑的(一个类可以有多个接口,却不能继承多个基类)

接口 

interface IChange//接口 命名以I开头,不能有构造函数,不能有修饰符,不能虚拟的静态的
        //实现接口的类 必须继承所有接口的方法和属性
    {
        string ChangegThing(string thing);//接口方法返回string类型
    }

  

class CDog: Animal,IChange //继承父类 猫和狗都是动物 实现接口都能跑
    {
        public CDog()//base()关键字代表父类
        {

        }
        public CDog(string name): base(name)
        {

        }
        public override string GetShout()//增加了override表示方法重写
        {
            return "汪!";
        }

        public string ChangegThing(string thing)
        {
            return base.Shout()+thing;
        }
}

 泛型的优点,比集合少装箱拆箱的过程,集合存在转换失败的可能

 protected void change_Click(object sender, EventArgs e)
        {
            IList<IChange> listAnimal=new List<IChange>();//泛型
            listAnimal.Add(new CDog("小狗"));
            listAnimal.Add(new CTiger("小虎"));

            Response.Write(listAnimal[0].ChangegThing("我是跑的"));//利用多态实现不同的ChangegThing
            Response.Write(listAnimal[1].ChangegThing("我也是跑的"));
        }

4.当猫叫一声,我来了,老鼠1和老鼠2分别叫猫来了快跑,和实现一个跑的方法

委托和事件

class Mouse//定义一个老鼠类
    {
        private string name;

        public Mouse(string name)
        {
            this.name = name;
        }

        public void Run()
        {
            Console.WriteLine("老猫来了快跑{0}",name);
        }
    }
 class Cat//定义一个猫类
    {
        private string Name;

        public Cat(string name)
        {
            this.Name = name;
        }

        public delegate void CatShoutEventHandler();//申明委托(委托是对函数的封装,delegate)

        public event CatShoutEventHandler CatShout;//申明事件 事件是一种特殊的委托,event

        public void Shout()
        {
            Console.WriteLine("喵,我是{0}",Name);
             if (CatShout != null)
            {
                CatShout();//如果CatShout有对象登记事件则执行CatShout,把老鼠跑方法登记在事件里,猫一叫,就执行老鼠的run方法
            }
        }
    }

 

 static void Main(string[] args)
        {
            Cat cat=new Cat("猫");
            Mouse mouse1=new Mouse("jukery");
            Mouse mouser2=new Mouse("kshds");

            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);
            cat.CatShout += new Cat.CatShoutEventHandler(mouser2.Run);//把方法登记在事件(事件event是特殊的委托delegate)
            cat.Shout();//执行shout方法的时候就是猫教的时候,通知两只老鼠,如果事件不为空,则执行委托里的方法
            Console.Read();
        }

  

 

  

 

 

 

  

时间: 2024-10-07 03:54:08

面向对象基础(继承类,抽象方法,接口,委托和事件)的相关文章

面向对象基础之抽象类与接口 下

在上篇博文中我们一起了解了抽象类,那么什么是接口呢?下面给大家简单介绍一下: 所谓接口,就是把隐式公共方法和属性组合起来,以封装特定功能的一个集合.一旦类实现了接口,类就可以支持接口所指定的所有属性和成员.声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式,因此接口不能实例化,不能有构造方法和字段,不能有修饰符,如public等.在实现接口的类中必须实现接口中的所有方法和属性. 一个接口可以支持多个接口,多个类也可以支持相同的接口.需要注意的是,接口用interface关

C#编程语言与面向对象——抽象基类与接口

在一个类前加“abstract”关键字,此类就成为抽象类. 对应的,在一个方法前加“abstract”关键字,此方法就成为抽象方法. abstract class Fruit //抽象类 { public abstract void GrowInArea();//抽象方法 } 注意抽象方法不能又实现代码,在方法名后直接跟一个分号. 抽象类专用于派生出子类,子类必须实现抽象类中所生命的方法.否子子类仍是抽象类. 抽象类一般用于表达一种比较抽象的事物,比如说“水果”,而抽象方法则说明此抽象类应该具有

附录A培训实习生-面向对象基础(1):类和实例

对象是一个自包含的实体,用一组可识别的特性和行为来标识. 面向对象编程,Object-Oriented Programming,其实就是针对对象进行编程的意思. 类就是具有相同属性和功能的对象的抽象的集合. 在编程过程中注意: 第一,类名称首字母记着要大写.多个单词则各个首字母大写. 第二,对外公开的方法需要用public修饰符. 实例,就是一个真实的对象. 实例化就是创建对象的过程,使用new关键字来创建. 下面是一个例子: 这是一个类, 1 using System; 2 using Sys

12-14面向对象--抽象基类、接口、委托

一.抽象类与抽象方法 1.在一个类前面加上abstract关键字,此类就成为了抽象类. 1)当一个类变成抽象类时,就不能作为一个对象使用了,也就是说不能创建新对象,不能new初始化. 2)抽象方法只是一个方法,不能写方法. 3)当一个类继承的是抽象类时,必须要把抽象类的抽象方法重写(override)才可以实现方法. 4)抽象方法必须放在抽象类里面才能使用,抽象方法是在抽象子类中实现的,也就是说抽象子类实现抽象父类所有的抽象方法. 5)有抽象方法的一定是抽象类:有抽象类但不一定有抽象方法. 6)

继承类,接口

继承类 继承方法定义格式:public abstract 返回值类型 方法名(参数); 继承类定义格式:public abstract class 类名 {} 抽象方法一定定义在抽象类中,抽象类不能直接创建对象,私有的方法子类是没法继承的. public interface Smoking { //成员变量的特点:public static final 数据类型 变量名=变量值: //静态常量 public static final int a=1; //抽象方法:public abstract

java 继承类与接口问题

java 先extends 继承类,再implements 继承接口 1 public class DataBase extends ClassBase implements Ijiekou { 2 3 }// end

.NET基础拾遗(4)委托、事件、反射与特性

Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 一.委托基础 1.1 简述委托的基本原理 委托这个概念对C++程序员来说并不陌生,因为它和C++中的函数指针非常类似,很多码农也喜欢称委托为安全的函数指针.无论这一说法是否正确,委托的的确确实现了和函数指针类似的功能,那就是提供了程序回调指定方法的机制. 在委托内部,包含了一个指向某个方法的指针(这一点上委托实现机制和C++的函数指针一致),为何称其

.NET基础拾遗(4)委托和事件2

事件 事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的. 引发事件的对象称为事件发送方.捕获事件并对其作出响应的对象叫做事件接收方. 在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件.所需要的是在源和接收方之间存在一个媒介(或类似指针的机制). .NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能. Microsoft的产品文档定义的事件:事件是一种使

python3 速查参考- python基础 8 -&gt; 面向对象基础:类的创建与基础使用,类属性,property、类方法、静态方法、常用知识点概念(封装、继承等等见下一章)

基础概念 1.速查笔记: #-- 最普通的类 class C1(C2, C3): spam = 42 # 数据属性 def __init__(self, name): # 函数属性:构造函数 self.name = name def __del__(self): # 函数属性:析构函数 print("goodbey ", self.name) I1 = C1('bob') #-- Python的类没有基于参数的函数重载 class FirstClass: def test(self,

面向对象基础之抽象类与接口 上

在两年前学习C++的时候,知道抽象类这么一个概念,当时并不是很理解,如今在学习C#和设计模式的时候,再一次碰到了这个含糊不清的东西,同时又在C#中学习到了接口技术,接口也早有耳闻,但是当时理解的接口就是一个或者一组能够操作类中数据的函数或者方法.虽然老师举过很多例子,比如电视机这个事物,它对外的接口就是遥控器,遥控器里好多的按钮,按钮的下面就是各种各样的命令或者称之为方法. 当抽象类遇到接口的时候,顿时蒙圈了,这两个概念的确是让人很难区别,那么我今天就来总结一下抽象类和接口到底有哪些区别和联系,