zoukankan      html  css  js  c++  java
  • C# 继承、虚方法、方法重载和多态

    继承:继承属于单继承,只能继承一个父类。

    继承的一个结果是派生于基类的子类在方法和属性上有一定的重叠。

    继承只能够同时继承与一个基类;可以同时继承一个基类和多个接口,但是基类必须放在第一个。(注:C#没有多继承,如果非得想用多继承形式,只能使用接口)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public class Aminal
            {
                public string Name;  // 定义宠物的名字
                public void PrintName()
                {
                    Console.WriteLine("宠物的名字:" + Name);
                }
            }
            // Dog继承Aminal类
            public class Dog : Aminal
            {
                //
            }
            static void Main(string[] args)
            {
                Dog dog = new Dog();
                dog.Name = "your name";
                dog.PrintName();
            }
        }
    }

     如果需要重定义方法可以使用new关键字来隐藏父类(不用new关键字也可以,不过如果是用的是vs文本编译器会有警告)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public class Aminal
            {
                public string Name;  // 定义宠物的名字
                public void PrintName()
                {
                    Console.WriteLine("宠物的名字:" + Name);
                }
            }
            // Dog继承Aminal类
            public class Dog : Aminal
            {
                // 隐藏父类的PrintName
                new public void PrintName()
                {
                    Console.WriteLine("名字为:" + Name);
                }
            }
            static void Main(string[] args)
            {
                Dog dog = new Dog();
                dog.Name = "your name";
                dog.PrintName();
                // 访问父类的PrintName方法
                ((Aminal)dog).PrintName();
                // 注:除了这种方法,如果想在Dog函数题里面访问父类可以使用base.<方法名>来访问
            }
        }
    }

    虚方法: 

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public class Aminal
            {
                public Aminal(string name)
                {
                    _name = name;
                }
                protected string _name;  // 定义宠物的名字
                // 定义虚方法
                virtual public void PrintName()
                {
                    Console.WriteLine("宠物的名字:" + _name);
                }
            }
            // Dog继承Aminal类
            public class Dog : Aminal
            {
                public Dog(string name) : base(name)
                {
                    // 调用父类构造函数
                }
                // 重写
                public override void PrintName()
                {
                    // base.PrintName(); // 这个是调用父类的虚方法
                    Console.WriteLine("这是重写方法,{0}", _name);
                }
            }
            // cat 方法
            public class Cat : Aminal
            {
                public Cat(string name) : base(name)
                {
                    // 调用父类构造函数
                }
                public override void PrintName()
                {
                    Console.WriteLine("阿猫叫:" + _name);
                }
            }
            static void Main(string[] args)
            {
                // 使用继承会显示或者隐式调用父类构造函数
                Aminal dog = new Dog("your name");
                dog.PrintName();
                Aminal cat = new Cat("your name2");
                cat.PrintName();
            }
        }
    }

    Public:公有属性,在类外可以随便访问。private:私有属性,在类外既不能够访问,也不能够修改。

    Class1.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Class1
        {
            // 定义私有属性
            private string _name;
            private int _age;
            public string Name
            {
                // 包含两个访问器
                get { return _name; }
                set { _name = value; }
            }
            //  使用快捷键Ctrl+R+E产生的接口
            public int Age
            {
                get
                {
                    return _age;
                }
    
                set
                {
                    // 对年龄进行判断
                    if(value>10&&value<23)
                        _age = value;
                }
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 使用类
                Class1 myname = new Class1();
                // 值得注意的是,单引号只能一个字符,双引号可以多个字符
                myname.Name = "namejr";
                myname.Age = 15;
                Console.WriteLine("我的名字是:" + myname.Name + ",年龄:" + myname.Age);
                Console.ReadKey();
            }
        }
    }

    什么是方法重载?

    方法重载就是在同一个类中使用相同的函数名,但是使用的参数类型或者数量不一样。

    值得注意的是:如果写了重载函数,原来的默认的重载函数(默认的函数按理说称为构造方法才会更合理,当然如果是重新自定义(不同于类名)的称为构造方法就不合适了)会被覆盖,如果还需要默认的无参重载函数,请务必重新写代码。

    具体实例如下:

    Class.1cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Class1
        {
            // 定义Sugar方法
            // 第一个使用string类型
            public void Sugar(string tang)
            {
                if (tang == "榴莲糖")
                    Console.WriteLine("我最喜欢吃了!!!");
                else
                    Console.WriteLine("滚你丫的!!!");
            }
            // 第二个使用int类型
            public void Sugar(int count)
            {
                if (count > 3)
                    Console.WriteLine("吃糖太多对牙齿不好!!!");
                else
                    Console.WriteLine("榴莲糖好好吃的呢!!!");
            }
            // 第三个数量不同
            public void Sugar(string tang, int count)
            {
                if (tang == "榴莲糖")
                    Console.WriteLine("是不是很好吃呀,我还有哦!!!");
                else if (tang != "榴莲糖" && count < 3)
                    Console.WriteLine("这个糖是不是不好吃,我有榴莲糖哦!!!");
                else
                    Console.WriteLine("你吃糖太多了,不给了,除非榴莲糖.");
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                // 使用类
                Class1 myname = new Class1();
                myname.Sugar("榴莲糖");  // 调用第一个方法
                myname.Sugar(1);  // 使用第二个方法
                myname.Sugar("牛奶糖", 2);
                myname.Sugar("榴莲糖", 10);
                myname.Sugar("大白兔奶糖", 12);
            }
        }
    }

    多态:

    多态性相对于继承可以更进一步,就是派生类型的变量可以赋值给基本类型的变量。

    例如:父类:Aminal、子类Dog

    Aminal adog = new Dog();

    adog.shout();  // 调用的是Dog.shout方法

  • 相关阅读:
    初次使用树莓派并启用root管理员(登录root管理员)
    windows安装laravel框架
    树莓派Raspbian Root密码是多少?
    树莓派学习笔记(1)解决用putty连接时出现connection refused的办法
    linux 根据端口kill掉进程
    swoole入门
    linux环境安装redis及扩展
    linux 命令
    linux 配置域名到指定目录
    微信公众号开发遇到的问题
  • 原文地址:https://www.cnblogs.com/namejr/p/10259404.html
Copyright © 2011-2022 走看看