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