Unity学习之路——C# 位操作、Flags、接口、抽象类
来源:互联网 发布:编程 开发 编辑:程序博客网 时间:2024/06/06 20:38
1.C#位操作符
位操作符是对数据按二进制位进行运算的操作符。c#位操作符包括:
- 按位与 &
- 按位或 |
- 按位取反 ~
- 按位异或 ^
- 左移 <<
- 右移 >>
举例说明
public static void Main() { int a=6&3; Debug.Log("a={0}",a); //6的二进制是00000110,3的二进制是00000011,按位与后等于00000010, 即2。 int b=6|3; Debug.Log("b={0}",b); //6的二进制是00000110,3的二进制是00000011,按位或后等于00000111,即7 int c=~6; Debug.Log("c={0}",c); //6的二进制是00000110,按位取反后是11111001即-7 int d=6^3; Debug.Log("d={0}",d); //6的二进制是00000110,3的二进制是00000011,按位异或后等于00000101,即5 int e=6<<3; Debug.Log("e={0}",e); //6的二进制是00000110,左移三位后等于00101000,即48 int f=6>>2; Debug.Log("f={0}",f); //6的二进制是00000110,右移二位等于00000001,即1 }
2.C#的Enum中的Flags的用法
Flags关键字允许我们在使用.net 枚举变量时,使用多个组合值
只需要在Enum上使用[Flags]标签即可标记为可组合的枚举。
[Flags] enum WeekDays { Monday = 0x1, Tuesday = 0x2, Wednesday = 0x4, Thursday = 0x8, Friday = 0x10, Saturday = 0x20, Sunday = 0x40 }
public static void Main(){ /**用'|'把各个枚举值分开*/ WeekDays wds = WeekDays.Monday | WeekDays.Tuesday | WeekDays.Sunday; Debug.Log("分开的值:"+wds); /**我们来看看计算过程: 或运算: 0000 0001 Monday 0x1 0000 0010 Tuesday 0x2 0100 0000 Sunday 0x40 = 0100 0011 = 67 这就用到了或运算,一个为true时结果就为true 换句话说,某个位上的1就代表了这个位上的值在枚举中存在 */ Debug.Log("3个值组合为:"+(int)wds); //利用上面规则来判断枚举值中是否包含某个枚举值就轻而易举了 //与运算'&' 两个同时为true时结果就为ture if ((wds & WeekDays.Monday) != 0) { Debug.Log("Monday是其中的值"); } if ((wds & WeekDays.Saturday) == 0) { Debug.Log("Saturday不是其中的值"); } /**如果将某个值去掉的话 * 将Sunday从枚举中去掉 * 0100 0011 * &1011 1111(~WheekDays.Sunday取反) * =0000 0011 这样就把Sunday去掉了 */ wds = wds & (~WeekDays.Sunday); Debug.Log("去掉Sunday的效果: " + wds);}
运行的结果:
3.C#的接口用法示例(interface)
注意:
- 接口不能包含字段
- 接口成员不允许添加访问修饰符,默认就是public,成员也不能加abstract访问修饰符
- 接口不能包含实现其成员的任何代码,而只只能定义成员本身(如不允许写具有方法体的函数)
- 实现过程必须在实现接口的类中完成。
接口的声明:
接口的成员可以是方法,属性,事件和索引器,但不能包含常数,字段,运算符,实例构造函数,析构函数或类型,也不能包括任何种类的静态成员。
定义一个公共接口:
public interface IView { void Call();}
分别用两个类实现接口:
public class AndroidView : IView{ public void Call() { Debug.Log("我是AndroidView"); }}
public class IOSView : IView{ public void Call() { Debug.Log("我是IOSView"); }}
测试代码:
void Init() { IView iv1 = new AndroidView(); iv1.Call(); IView iv2 = new IOSView(); iv2.Call(); }输出结果:
显示实现接口:
- 实现接口的方法前不能用访问修饰符public,必须显示指定接口名称
- 返回值类型 接口名称.接口方法
- 只能是通过接口来调用,而不能通过具体类来做
再定义一个接口,相同的方法:
public interface IView2 { void Call();}显示实现接口:
public class AllView : IView,IView2 { void IView.Call() { Debug.Log("我是IView接口"); } void IView2.Call() { Debug.Log("我是IView2接口"); }}作用就是指定方法到底是哪个接口
void Init() { IView iView = new AllView(); iView.Call(); IView2 iView2 = new AllView(); iView2.Call();}
测试结果:
接口使方法具有较好扩展性.
C#的抽象方法(abstract)
- 抽象类前有关键字abstract,没有则为非抽象类
- 抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此不能new,不能sealed
- 如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类
- 如果一个非抽象类从抽象类中派生,则其必须通过重载来实现所有继承而来的抽象成员
- 抽象方法不提供任何实际实现
- 抽象方法不能有任何可执行程序,哪怕是方法体{}
- 重写抽象方法时采用override实现
先定义一个抽象类:
public abstract class Test { public abstract void GetPow(int a, int b);}继承抽象类并且实现方法:
public class Test1 : Test{ public override void GetPow(int a, int b) { Debug.Log("求幂的结果:" + Mathf.Pow(a, b)); }}测试代码:
void Init() { Test1 test1 = new Test1(); test1.GetPow(2,10); }测试结果:
阅读全文
3 3
- Unity学习之路——C# 位操作、Flags、接口、抽象类
- C#学习之接口和抽象类
- c#之抽象类, 接口
- C# 位域[flags]
- C# 位域[flags]
- java学习笔记之—接口和抽象类
- C#温故而知新学习系列之面向对象编程—接口和抽象类的区别是什么?(十八)
- C# 之 抽象类与接口
- C#复习之抽象类和接口
- java学习——抽象类、接口
- C# 接口、抽象类
- .NET简谈C#之美—抽象类与接口孽缘
- unity之抽象类
- JAVA学习之抽象类和接口
- JAVA学习之:抽象类与接口
- Java学习之---抽象类与接口
- java学习之抽象类与接口
- .NET学习之抽象类和接口
- 扫雷
- Python
- 2017/08/23 备忘
- bzoj 3358: [Usaco2004 Jan]洪水
- 数据结构(一)-顺序存储结构的插入和删除:向指定位置的数组插入和删除元素
- Unity学习之路——C# 位操作、Flags、接口、抽象类
- flannel 概述
- ubuntu修改mysql默认路径和修改max_connect参数
- Spring boot 搭建个人博客系统(六)——文章点击量和阅读排行榜
- Android动画(一)-视图动画
- js打开本地某个APP
- 桥接模式
- 敏感词过滤
- 合并财务报表无条件抵销分录