`
灵雨飘零
  • 浏览: 36446 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
文章分类
社区版块
存档分类
最新评论

多态的实现

 
阅读更多

  多态的实现有3种方法:

  1、类的继承(虚方法) ;2、抽象类; 3、接口

  1、类的继承

继承与里氏转换配合使用也可以实现多态的。在这里简单讲一下里氏转换:a.子类的对象可以隐式转换成父类的对象。例: Student(子类) st=new Student();Person(父类) p=st; b.把父类的对象强转成子类的对象。例:Student st=(Student)p; 使用通过继承和里氏转换也可以实现一个对象表现出多种状态。       ->虚方法:子类中对某一个方法大部分相同,个别不同,在父类中定义虚方法,一样的用继承的,不一样的重写。

  ->例子:假设所有的人都会走路,并且大部分人都是用2条腿走,只有个别人比如老人(3条腿)、残疾人,所以走路定义在人类中,正常人类的子类 都用父类的走路方法继承就行了,特殊子类如老人类可以重写走路的方法

  ->关键字用在哪里?

  ->new如果子类继承父类,而方法名又相同,在子类的方法中加new则叫显示隐藏基类方法,没有new则叫隐式隐藏基类方法;如果不看父类,则不知道父类中是否有这个方法,或者子类的方法是否是父类的重写和隐藏父类的方法;所以只要加了new就是父类的隐藏方法。如果父类中没有这个方法而又加了new则会警告,这个方法不会隐藏继承的成员,不需要new关键字。所以在这种情况下new就是一个标记,表示子类是否是隐藏基类方法。

  ->virtual和override virtual是为了让子类重写,所以virtual用在父类里;override表示重写父类方法,所以用在子类中。在父类的方法中加virtual表示 这个方法是虚方法,表示:如果在子类中写了一个同样的方法,在使用时就会调用子类中的方法,而不会调用父类中的这个方法,就是说当子类中没有这个方法时,而又要用这个方法,就会从父类中调用。而override写在子类中时就说明在子类中重写了父类的方法;如果父类中没有写virtual子父类中又写override就会发生异常,2个同样的方法就会冲突,子类中的方法就无法重写。如果父类的方法中写了virtual而子类的方法中没有写override,这种情况是可以发生的,子类一样重写的父类的方法。而如果在子类中使用new关键字的话也是能重写父类方法的。

  ->public 定义这个类到处可以被访问

  ->internal 本程序集访问 本项目

  ->private 只能在本类中访问

  ->protected 只能在本类和子类中访问

  ->abstract表示抽象

  2、抽象类:

他是用于指定蓝图的,是法律的制定者或规划者,是领导,他自己不做,让手下去做,并且手下的能力不同,完成的效果也不同。所以抽象类也可以实现多态。

  ->抽象方法:指定蓝图用的,用于子类都必须有,但每个子类的方法实现的功能都不同,用这个在父类中限制子类必须有的方法,并且子类实现了自己与本人不同的方法体。      ->例子:所有国家的人都会说话,但每个国家的人说的语言都不一样,所以把说话定义成抽象方法,定义在抽象类人中,在定义每个国家的人类时都必须有说话的方法,并且每个国家都能说自己的语言。

  3、接口

个别子类拥有的方法,定义一个功能(接口),谁想拥有这个功能就继承(接口)。

  ->例子:接口就是一个规范,比如收作业这个功能接口,既不能定义在父类人类中,因为学生要收作业,老师要收作业,但是工程师不需要收作业;而定义在父类中可以用虚方法和抽象方法,子类工程师不需要收作业这个功能,就不能定义在父类中。所以要定义一个接口功能,那么子类谁想用这个接口功能只要继承接口就行了。

  

代码演示:

  抽象类

namespace _03抽象
{
    class Program
    {
        static void Main(string[] args)
        {            
            while (true)
            {
                Person p = CreatePerson();
                p.Say();
                Console.ReadKey();
            }
        }

        static Person CreatePerson()
        {
            //简单工厂模式
            Random r = new Random();
            int i = r.Next(1, 4);
            switch (i)
            {
                case 1:
                    return new 中国人();
                case 2:
                    return new 日本人();
                default:
                    return new 韩国人();
            }
        }
    }

   abstract class Person
    {
        string name;

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

        public abstract void Say();
    }

    class 中国人 : Person
    {
        public override void Say()
        {
            Console.WriteLine("中国话");
        }
    }

    class 日本人 : Person
    {
        public override void Say()
        {
            Console.WriteLine("日语");
        }
    }

    class 韩国人 : Person
    {
        public override void Say()
        {
            Console.WriteLine("韩语");
        }
    }
}

 

虚方法

namespace _04虚方法
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p;
            p = new 成年人();
            p.Go();
            p = new 老年人();
            p.Go();

            p = new 脚残疾的人();
            p.Go();
          
            Console.ReadKey();
        }
    }

     class Person
    {
        string name;

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

        public virtual void Go()
        {
            Console.WriteLine("用脚走路!");
        }       
    } 

     class 成年人 : Person
     {
     }

     class 老年人 : Person
     {

     }

     class 脚残疾的人 : Person
     {
          public override  void Go()
         {
             Console.WriteLine("脚残,用手走~!");
         }
     }
}


接口

namespace _05接口
{

    interface I收作业
    {
        void 都给我交作业();
    }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }

    class Person
    {
        string name;

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

    class 老师 : Person,I收作业
    {

        public void 都给我交作业()
        {
            Console.WriteLine("都交作业了!");
        }
    }
    class 学生 : Person, I收作业
    {

        public void 都给我交作业()
        {
            Console.WriteLine("都交作业了!");
        }
    }

    class 工程师 : Person
    {

    }
}



分享到:
评论

相关推荐

    接口的多态实现

    在编程领域,接口的多态实现是面向对象设计的一个核心概念,它允许代码具有灵活性和扩展性。接口在Java、C#等面向对象语言中扮演着重要的角色,它定义了一组方法签名,但不提供具体实现。类可以实现一个或多个接口,...

    C++之多态实现机制剖析

    本文将深入剖析C++中的多态实现机制。 1. 虚函数(Virtual Functions) 虚函数是C++中实现动态多态的基础。通过在基类中声明虚函数,子类可以重写这些函数,使得在使用基类指针或引用调用该函数时,实际执行的是...

    java中多态实现

    java多态实现的课件,给那些需要的人 讲述了java多态的概念、分类、实现 综合案例讲解、总结多态的作用

    缓冲区问题和多态实现原理

    在编程领域,缓冲区问题和多态实现是两个重要的概念,尤其在C++这样的面向对象编程语言中。这里,我们将深入探讨这两个主题。 首先,我们来看“缓冲区问题”。缓冲区是一个临时存储数据的区域,它在计算机内存中...

    上机01_多态实现器乐演奏.zip

    标题中的"上机01_多态实现器乐演奏.zip"表明这是一个关于C#编程的实践练习,重点在于实现多态性(Polymorphism)在器乐演奏中的应用。多态性是面向对象编程的核心概念之一,允许我们使用一个通用接口来处理不同类型...

    Java多态实现

    Java多态实现是面向对象编程中的一个核心概念,它允许我们使用父类的引用变量来指向子类的对象,从而在运行时决定所调用的方法。这一特性极大地增强了代码的灵活性和扩展性,使得代码能够更好地应对未来的需求变化。...

    c++多态实现原理分析1

    C++ 多态实现原理分析 C++ 的多态性是面向对象开发中一个非常重要的特性,它允许程序在运行时根据不同的对象类型执行不同的函数,从而实现多种行为。那么,C++ 是如何实现多态性的呢?下面我们将深入探讨 C++ 多态...

    C++对象布局及多态实现

    在C++编程中,对象布局和多态实现是两个核心概念,它们对于理解和优化程序性能至关重要。对象布局指的是在内存中如何存储类实例,而多态则是C++面向对象编程的关键特性之一,允许不同类型的对象以统一的方式进行交互...

    C#多态实现计算器有BUG,求解决!

    在你提到的问题中,“C#多态实现计算器有BUG,求解决!”很可能是指在设计和实现一个基于多态的计算器类层次结构时遇到了问题。下面,我们将深入探讨多态性在C#中的应用以及可能引发的常见问题,并给出相应的解决...

    利用C++及其多态实现的职工管理系统

    利用C++及其多态实现的职工管理系统

    C++多态技术的实现和反思

    文章指出,C++的多态实现方式与早期的Smalltalk系统有着本质的不同,这种差异不仅影响了多态的效率,也对程序员的设计决策提出了挑战。 ### C++多态的实现原理 C++中的多态主要通过虚函数来实现。当一个基类指针或...

    C#第六章 初始继承和多态.pdf

    C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf

    c#中应用多态的计算器

    在这个“C#中应用多态的计算器”示例中,我们将探讨如何在计算器程序中实现这一概念。 首先,让我们理解什么是多态。多态是指一个接口可以有多种不同的表现形式或实现。在C#中,多态可以通过方法重载、方法重写...

    c++多态实现通讯录 通讯录管理程序

    通讯录管理程序。通讯录是由通讯录条目组成的。通讯录总条目数。通讯录中现有多少条。可以输入通讯录、可以输出通讯录、可以查找、修改。其中的通讯录条目可以是一般条目,也可以是朋友条目。 要求: ...

    继承和多态笔记.docx

    在Java中,多态主要通过方法重载(overloading)和方法重写(overriding)来实现。 - **方法重载**: - 参数列表必须不同(数量、类型或顺序)。 - 方法名相同。 - 与方法的修饰符和返回类型无关。 - 调用原理...

    深入Java核心 Java中多态的实现机制编程资料

    本文将围绕Java中的多态实现机制展开讨论,包括多态的基本概念、实现原理以及具体的实践案例。 #### 多态的基本概念 多态(Polymorphism)源自希腊语“poly”(多)和“morph”(形态),在计算机科学中指同一个...

    VC8.0上多态的实现

    #### 三、汇编级视角下的多态实现 在汇编代码层面,多态的实现细节更加具体和底层。以下是以`CTest1`类为例,通过其构造函数的汇编代码,来探讨多态的实现机制: ```assembly ??0CTest1@@QAE@XZPROC ;CTest1::...

    C++程序设计员工信息管理并用多态实现

    实现1.新增员工信息 2.删除员工信息 3.员工信息搜索(按姓名) 4.员工信息分类存储 5.员工信息导入 6.按工资排序 7.退出 ******请选择:1

    java多态的实现

    本文将深入探讨Java中的多态实现,其特征以及在实际编程中应注意的事项。 首先,多态的实现主要基于以下两个机制: 1. 继承(Inheritance):子类继承父类,可以获得父类的属性和方法。这为多态提供了基础,因为...

Global site tag (gtag.js) - Google Analytics