1.属性

//属性的2种写法
public class person
{
    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name=value;
        }
    }
    public int Age
    {
        get;
        set;
    }
} 

 2.索引器

//外部调用
person p=new person;
sting str=p[]
public class person
{
    private string _name;
    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            _name=value;
        }
    }
    public int Age
    {
        get;
        set;
    }
        public string Email
    {
        get;
        set;
    }
//也可以用 sting 键值,也可以多个参数
//可以重载,PS:public string this[int index],public string this[string key]
    public string this[int index]
    {
        get
        {
            string result="";
            switch(index)
            {
                :
                result=this.Name;
                break;
                :
                result=this.Age;
                break;
                :
                result=this.Email;
                break;
            }
            return result;
        }
    }
} 

 3.方法重写/重载

方法重写(子类重写父类)

父类中的方法子类要想重写需要将父类方法标记为virtual

子类重写父类方法时,使用的关键字override

方法重载(一个类中的多个重名的方法)

4.多态

①里氏替换原则

//需要一个父类类型对象,可以赋值一个子类类型对象,叫做"里氏替换",反过来不成立!
Person p = new Chinese();
public class Person
{
}
public class Chinese:Person
{
}

②多态

实现多态的方法

方法1虚方法virtual子类重写父类中的方法

方法2 抽象类abstract 子类重写父类中的方法

方法3 接口 实现接口的类,将接口中的方法实现

方法1虚方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _10通过继承实现多态
{
    class Program
    {
        static void Main(string[] args)
        {
            Chinese cn1 = new Chinese("中国人");
            Person[] pers = { cn1 };

            ; i < pers.Length; i++)
            {
                //实现了多态
                pers[i].ShowNationality();
            }
            Console.ReadKey();
        }

    }
    public class Person
    {
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public string Email
        {
            get;
            set;
        }
        //父类中的方法子类要想重写需要将父类方法标记为virtual.
        //虚方法,子类可以重写也可以不重写。
        public virtual void ShowNationality()
        {
            Console.WriteLine("......");
        }
        public override string ToString()
        {
            return this.Name;
        }
    }

    public class Chinese : Person
    {
        public Chinese(string name)
        {
            this.Name = name;
        }

        public string HuKou
        {
            get;
            set;
        }
        public void Say()
        {
            Console.WriteLine("我是中国人.");
        }

        //子类重写父类方法时,使用的关键字是override
        public override void ShowNationality()
        {
            Console.WriteLine("【中国】");
        }
    }
}

方法2抽象

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _15通过抽象类来实现多态2
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Japanese();
            p.Name = "mamm";
            p.Say();
            Console.WriteLine(p.Name);
            Console.ReadKey();
        }
    }

    //抽象类的特点:
    //1.抽象类不能被实例化。
    //2.抽象类中可以有实例成员,也可以有抽象成员。
    public abstract class Person
    {
        public abstract string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public string Email
        {
            get;
            set;
        }

        //1.将virtual关键字变为abstract。
        //2.抽象成员不能有任何实现代码
        //3.抽象成员只能出现在抽象类中。所以要把当前类也标记为abstract
        //4.与虚方法不同,抽象方法子类必须重写(除非子类也是抽象类)
        public abstract void Say();

    }

    public class Chinese : Person
    {
        public override void Say()
        {
            Console.WriteLine("Chinese中的Say");
        }

        public override string Name
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }
    }

    public class Japanese : Person
    {

        public override void Say()
        {
            Console.WriteLine("Japanese中的Say方法。");
        }

        public override string Name
        {
            get
            {
                return "aaa";
            }
            set
            {

            }
        }
    }
}

方法3.接口

//1.接口中只能包含方法(属性、事件、索引器也都是方法)
//2.接口中的成员都不能有任何实现。

//3.接口不能被实例化。

//4.接口中的成员不能有任何访问修饰符。(默认为public)

//5.实现接口的子类必须将接口中的所有成员全都实现。

//6.子类实现接口的方法时,不需要任何关键字,直接实现即可。

//7.接口存在的意义就是为了多态。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _05接口1
{
    class Program
    {
        static void Main(string[] args)
        {
            //1.接口解决了多继承的问题。(抽象类不行。)

            //2.当不同类型要实现多态时,无法抽象出公共的父类,这时可以考虑使用接口(比如:鸟和飞机都能飞,但是无法抽象出共同的父类。)
            IShow ren = new Japanese();//new Chinese();
            ren.Show();
            Console.ReadKey();
        }
    }

    public class Person
    {
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public string Email
        {
            get;
            set;
        }
    }

    public interface IShow
    {
        //显示国籍。
        void Show();
    }

    public class Chinese : Person, IShow
    {
        #region IShow 成员

        public void Show()
        {
            Console.WriteLine("中国");
        }

        #endregion
    }

    public class Japanese : Person, IShow
    {

        #region IShow 成员

        public void Show()
        {
            Console.WriteLine("日本");
        }

        #endregion
    }
}

public interface ISupperMan
{
   // 1.接口里面只能包含方法(事件、属性、索引器)
    //2.接口中的成员不能有访问修饰符默认是public
    void Fly();

    void Fight();
}

//实现接口的类必须把接口中的所有成员都实现。
public class Person : ISupperMan
{
    public string Name
    {
        get;
        set;
    }
    public int Age
    {
        get;
        set;
    }
    public string Email
    {
        get;
        set;
    }

    #region ISupperMan 成员

    public void Fly()
    {

    }

    public void Fight()
    {

    }

    #endregion
}

C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-的更多相关文章

  1. CLR via C#(11)-无参属性、有参数属性(索引器)

    一. 无参属性 1. 定义属性 无参属性就是我们最常见的属性方式,在赋值时可以加入一定的逻辑判断.属性的定义其实不复杂,先看个直观的例子: 说明: 属性要定义名称和类型,且类型不能是void. 属性是 ...

  2. C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件

    一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...

  3. LindAgile~缓存拦截器支持类的虚方法了

    写它的原因 之前写过一个缓存拦截器,主要在方法上添加CachingAspect特性之后,它的返回值就可以被缓存下来,下次访问时直接从缓存中返回结果,而它有一个前提,就是你的方法需要是一个接口方法,缓存 ...

  4. C#多态--虚方法实现多态

    1.虚方法提供一种默认实现,子类可以选择是否重写,如果不重写,那么就使用父类已经实现的方法.(重写可以改变方法的指针) 如果需要改变类型指针,那么需要做方法的重写: 1.如果子类方法是重写方法,那么系 ...

  5. c# 多态 虚方法

    多态: 为了解决同一种指令,可以有不同行为和结果 在运行时,可以通过调用同一个方法,来实现派生类中不同表现. 虚方法——抽象类——抽象函数——接口 虚方法: 被virtual 关键字修饰的方法  叫做 ...

  6. C# 虚方法 抽象方法 接口

    虚方法:virtu 注意的几点: 1,父类中如果有方法让子类重写,则可以将该方法标记为virtual 2.虚方法在父类中必须有实现,哪怕是空实现 3虚方法子类可以重写,也可以不重写 4.如果类是抽象类 ...

  7. C#中的抽象方法,虚方法,接口之间的对比

    1.首先来看一看抽象类 抽象类是特殊的类,不能够被实例化:具有类的其他特性:抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写.另外,抽象类可以派生自 ...

  8. 浅谈C#抽象方法、虚方法、接口

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  9. Java 多态 虚方法

    Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载. 看代码: package com.company; public class Main { public stati ...

随机推荐

  1. iOS Block界面反向传值

    在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...

  2. centos 7 64位虚机上android4环境运行

    场景 现在的开发大多是在linux的虚拟机上进行,现在有些工作和android有关,因此初步尝试了一下是否可以和目前的场景进行统一. 系统是在vmware workstaion上的centos 7的6 ...

  3. Android系统的五种数据存储形式(一)

    Android系统有五种数据存储形式,分别是文件存储.SP存储.数据库存储.contentprovider 内容提供者.网络存储.其中,前四个是本地存储.存储的类型包括简单文本.窗口状态存储.音频视频 ...

  4. RoboGuice 3.0 (三)总结篇

    经过前两篇的介绍,我们了解了如何使用RoboGuice方便的为我们注入需要的对象,这篇将着重说明原理. 一.Guice与RoboGuice Guise是Google开发的一个轻量级的依赖注入框架,主要 ...

  5. Mybatis基于注解的方式访问数据库

    1. 使用方式:在Service层直接调用 package com.disappearwind.service; import org.springframework.beans.factory.an ...

  6. SQL SERVER 2012链接到SQL SERVER 2000的问题解决案例

    前几天在在桦仔的SQLSERVER走起微信公众帐号看到一篇文章MS SQL Server2014链接MS SQL Server 2000,当时手机上囫囵吞枣看了个大概,知道是由于SQL SERVER ...

  7. SQL SERVER 2014 下IF EXITS 居然引起执行计划变更的案例分享

    这个问题是在SQL SERVER 2005 升级到SQL SERVER 2014的测试过程中一同事发现的.我觉得有点意思,遂稍微修改一下脚本展示出来,本来想构造这样的一个案例来演示,但是畏惧麻烦,遂直 ...

  8. javascript - 享元模式

    享元模式笔记  运用共享技术有效的支持大量的细粒度对象,避免对象间拥有相同内容造成多余的开销  享元模式主要还是对其数据.方法共享分离,它将数据和方法分成内部数据.内部方法和外部数据.外部方法.  内 ...

  9. SQL Server 2008 R2——软件创建月表时同时创建一个触发器

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  10. java实现串口通讯

    一. 准备工作 1. 点击此下载java串口通讯相关工具 2. 将RXTXcomm.jar放到  %JAVA_HOME%\jre\lib\ext\  目录下,工程中引入该jar包 3. 将rxtxSe ...