11.拓展方法

11.面向对象-封装-拓展方法


11.1 知识点

知识回顾

class 类名
{
    #region 特征——成员变量
    #endregion
    #region 行为——成员方法
    #endregion
    #region 初始化调用——构造函数
    #endregion
    #region 释放时调用——析构函数
    #endregion
    #region 成员属性
    #endregion
    #region 索引器
    #endregion
    #region 静态成员
    #endregion
}
#region 静态类和静态构造函数
#endregion

拓展方法基本概念

  • 概念
    • 为现有非静态变量类型添加新方法。
  • 作用
    • 提升程序拓展性。
    • 不需要在对象中重新写方法。
    • 不需要继承来添加方法。
    • 为别人封装的类型写额外的方法。
  • 特点
    • 一定是写在静态类中。
    • 一定是个静态函数。
    • 第一个参数为拓展目标。
    • 第一个参数用 this 修饰。

拓展方法的基本语法

访问修饰符 static 返回值 函数名(this 拓展类名 参数名, 参数类型 参数名, 参数类型 参数名....)

拓展方法的实例

// 静态工具类
static class Tools
{
    // 为现有非静态变量类型添加新方法
    // 成员方法是需要实例化对象后才能使用的
    // value 代表使用该方法的实例化对象
    public static void SpeakValue(this int value)
    {
        // 拓展的方法的逻辑
        Console.WriteLine("林文韬为int拓展的方法" + value);
    }

    // 为 string 拓展了一个成员方法
    public static void SpeakStringInfo(this string str, string str2, string str3)
    {
        Console.WriteLine("林文韬为string拓展的方法");
        Console.WriteLine("调用方法的对象" + str);
        Console.WriteLine("传的参数" + str2 + str3);
    }
}

拓展方法的使用

int i = 10; // 实例化对象 i
i.SpeakValue(); // 林文韬为int拓展的方法10

string str = "000"; // 实例化对象 str
str.SpeakStringInfo("111", "222");
// 林文韬为string拓展的方法
// 调用方法的对象000
// 传的参数111222

为自定义的类型拓展方法

// 测试类
class Test
{
    public int i = 10;
    public void Fun1()
    {
        Console.WriteLine("Fun1");
    }

    public void Fun2()
    {
        Console.WriteLine("Fun2");
    }
}

// 静态工具类内
public static void Fun3(this Test t)
{
    Console.WriteLine("为test拓展的方法 Fun3");
}

// Test 类中自己有 Fun2 方法,则无法调用拓展方法中的 Fun2 方法
public static void Fun2(this Test t)
{
    Console.WriteLine("为test拓展的方法 Fun2");
}

// 主函数内
Test t = new Test();
t.Fun1(); // Fun1
t.Fun3(); // 为test拓展的方法 Fun3
t.Fun2(); // Fun2
// Test 类中自己有 Fun2 方法,则无法调用拓展方法中的 Fun2 方法

总结

  • 概念
    • 为现有的非静态变量类型添加方法。
  • 作用
    • 提升程序拓展性。
    • 不需要再在对象中重新写方法。
    • 不需要继承来添加方法。
    • 为别人封装的类型写额外的方法。
  • 特点
    • 静态类中的静态方法。
    • 第一个参数代表拓展的目标。
    • 第一个参数前面一定要加 this.
  • 注意
    • 可以有返回值和任意个参数。
    • 根据需求而定。

11.2 知识点代码

using System;

namespace Lesson9_封装_拓展方法
{
    #region 知识回顾
    class 类名
    {
        #region 特征——成员变量

        #endregion

        #region 行为——成员方法

        #endregion

        #region 初始化调用——构造函数

        #endregion

        #region 释放时调用——析构函数

        #endregion

        #region 成员属性

        #endregion

        #region 索引器

        #endregion

        #region 静态成员

        #endregion
    }

    #region 静态类和静态构造函数

    #endregion
    #endregion

    #region 知识点一 拓展方法基本概念
    //概念:为现有非静态 变量类型 添加 新方法
    //作用
    //1.提升程序拓展性
    //2.不需要再对象中重新写方法
    //3.不需要继承来添加方法
    //4.为别人封装的类型写额外的方法
    //特点
    //1.一定是写在静态类中
    //2.一定是个静态函数
    //3.第一个参数为拓展目标
    //4.第一个参数用this修饰
    #endregion

    #region 知识点二  拓展方法的基本语法
    //访问修饰符 static 返回值 函数名(this 拓展类名 参数名, 参数类型 参数名,参数类型 参数名....)
    #endregion

    //class语句块外 namespace语句块内

    #region 知识点三  拓展方法的实例

    //静态工具类
    static class Tools
    {
        //为现有非静态 变量类型 添加 新方法
        //我们是不能进入C#写好的int里添加成员的
        //但是可以使用拓展方法 相当于为int拓展了一个成员方法
        //成员方法 是需要 实例化对象后 才 能使用的
        //value 代表 使用该方法的 实例化对象
        public static void SpeakValue(this int value)
        {
            //拓展的方法 的逻辑
            Console.WriteLine("林文韬为int拓展的方法" + value);
        }

        //为string拓展了一个成员方法
        public static void SpeakStringInfo(this string str, string str2, string str3)
        {
            Console.WriteLine("林文韬为string拓展的方法");
            Console.WriteLine("调用方法的对象" + str);
            Console.WriteLine("传的参数" + str2 + str3);
        }

        #region 知识点五 为自定义的类型拓展方法
        //静态工具类内
        public static void Fun3(this Test t)
        {
            Console.WriteLine("为test拓展的方法 Fun3");
        }

        //Test类中自己有Fun2方法 则无法调用拓展方法中的Fun2方法
        public static void Fun2(this Test t)
        {
            Console.WriteLine("为test拓展的方法 Fun2");
        }

        //public static void Fun4(this Console t)//报错 不能为静态类拓展方法 
        //{
        //    Console.WriteLine("为test拓展的方法 Fun4");
        //}

        #endregion
    }

    #endregion

    #region 知识点五 为自定义的类型拓展方法

    // 测试 类
    class Test
    {
        public int i = 10;
        public void Fun1()
        {
            Console.WriteLine("Fun1");
        }

        public void Fun2()
        {
            Console.WriteLine("Fun2");
        }
    }
    #endregion
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("拓展方法");

            //主函数内
            #region 知识点四 拓展方法的使用

            int i = 10;//实例化对象 i
            i.SpeakValue();//林文韬为int拓展的方法10
            //实例化对象i调用了拓展方法

            string str = "000";//实例化对象 str
            str.SpeakStringInfo("111", "222");
            //林文韬为string拓展的方法
            //调用方法的对象000
            //传的参数111222
            //实例化对象str调用了拓展方法

            #endregion

            #region 知识点五 为自定义的类型拓展方法

            Test t = new Test();
            t.Fun1();//Fun1
            t.Fun3();//为test拓展的方法 Fun3
            t.Fun2();//Fun2
            //Test类中自己有Fun2方法 则无法调用拓展方法中的Fun2方法

            #endregion
        }
    }

    //总结:
    //概念:为现有的非静态 变量类型 添加 方法
    //作用:
    // 提升程序拓展性
    // 不需要再在对象中重新写方法
    // 不需要继承来添加方法
    // 为别人封装的类型写额外的方法

    //特点:
    //静态类中的静态方法
    //第一个参数 代表拓展的目标
    //第一个参数前面一定要加 this

    //注意:
    //可以有返回值 和 n个参数
    //根据需求而定
}

11.3 练习题

为整形拓展一个求平方的方法

class语句块外 namespace语句块内

//工具类
static class Tools
{
    //求平方方法
    public static int Square(this int value)
    {
        return value * value;
    }
}

主函数内

// 主函数内
int i = 2;
Console.WriteLine(i.Square());//4

写一个玩家类,包含姓名,血量,攻击力,防御力等特征,攻击,移动,受伤等方法,并为该玩家类拓展一个自杀的方法

class语句块外 namespace语句块内

//工具类2
static class Tools2
{
    //玩家类的自杀拓展方法
    public static void KillSelf(this Player p)
    {
        Console.WriteLine("玩家" + p.name + "自杀");
    }
}

//玩家类
class Player
{
    //成员
    public string name;
    public int hp;
    public int atk;
    public int def;

    public void Atk(Player otherPlayer)
    {

    }
    public void Move()
    {

    }
    public void Wound(Player otherPlayer)
    {

    }
}

主函数内

// 主函数内
Player p = new Player();
p.name = "小红";
p.KillSelf();//玩家小红自杀

11.4 练习题代码

using System;

namespace Lesson9_练习题
{
    //class语句块外 namespace语句块内
    #region 练习题一
    //为整形拓展一个求平方的方法

    //工具类
    static class Tools
    {
        //求平方方法
        public static int Square(this int value)
        {
            return value * value;
        }
    }
    #endregion

    #region 练习题二
    //写一个玩家类,包含姓名,血量,攻击力,防御力等特征,攻击,移动,受伤等方法
    //为该玩家类拓展一个自杀的方法

    //工具类2
    static class Tools2
    {
        //玩家类的自杀拓展方法
        public static void KillSelf(this Player p)
        {
            Console.WriteLine("玩家" + p.name + "自杀");
        }
    }

    //玩家类
    class Player
    {
        //成员

        public string name;
        public int hp;
        public int atk;
        public int def;

        public void Atk(Player otherPlayer)
        {

        }
        public void Move()
        {

        }
        public void Wound(Player otherPlayer)
        {

        }
    }

    #endregion
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("拓展方法练习题");

            //主函数内

            #region 练习题一
            int i = 2;
            Console.WriteLine(i.Square());//4
            #endregion

            #region 练习题二
            Player p = new Player();
            p.name = "小红";
            p.KillSelf();//玩家小红自杀
            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏