C# 部分类
partial 修饰符
partial class Program 在别处在定义一个 相同类(相同命名空间), 编译器自动将其合并为一个类
C# 抽象类
事件定义声明
EEE
public delegate void EEE(string flag, int n); // 事件(类型)定义声明
定义一个抽象类
关键字 abstract
public abstract class Duck // 抽象类
{
protected int x;
public abstract int X {get; set;} // 抽象属性
public abstract void Aget(int n); // 抽象方法
public abstract event EEE eevent; // 抽象事件
public abstract string this[int index]{get; set;} // 抽象索引
}
定义抽象属性
public abstract int X {get; set;} // 抽象属性
定义抽象方法
public abstract void Aget(int n); // 抽象方法
定义抽象事件
public abstract event EEE eevent; // 抽象事件
定义抽象索引
public abstract string this[int index]{get; set;} // 抽象索引
实现抽象类
实现抽象属性
public override int X // 重写属性
{
get
{
OnEevent("Get", x); // 这里访问 X 才会触发, 直接访问 x 将不会触发
return x;
}
set
{
x = value;
OnEevent("Set", x); // 同理, x 初始值为 0 是也不会触发
}
}
实现抽象方法
public override void Aget(int n) // 重写方法
{
X = n;
}
实现抽象事件
new REevent 一个事件代替抽象事件,使抽象事件操作新事件 REevent
private event EEE REevent; // 事件
public override event EEE eevent // 重写事件
{
add
{
REevent += value;
}
remove
{
REevent -= value;
}
}
事件订阅
我这里是在类构造函数里面订阅的
public RealDuck()
{
eevent += SetValue; // 事件订阅
eevent += GetValue; // 事件订阅
}
事件处理和响应
响应
public void OnEevent(string flag, int n) // 事件触发
{
if (REevent != null)
REevent(flag, n);
}
处理
public void GetValue(string flag, int n)
{
if (flag == "Get")
Console.WriteLine("x 的值 {0} 被获取了", n);
}
public void SetValue(string flag, int n)
{
if (flag == "Set")
Console.WriteLine("x 的值被设置为 {0}", n);
}
事件触发
OnEevent 在 X 的 get 和 set 两个方法被调用时触发
public override int X // 重写属性
{
get
{
OnEevent("Get", x); // 这里访问 X 才会触发, 直接访问 x 将不会触发
return x;
}
set
{
x = value;
OnEevent("Set", x); // 同理, x 初始值为 0 是也不会触发
}
}
实现抽象索引
private string[] StrArray = {"A", "B", "C"};
public override string this[int index] // 重写索引器
{
get
{
if (index > StrArray.Length && index < 0)
return null;
else return StrArray[index];
}
set
{
if (index < StrArray.Length && index >= 0)
StrArray[index] = value;
}
}
完整代码
[C#] 纯文本查看 复制代码
using System;
namespace TestA
{
public delegate void EEE(string flag, int n); // 事件声明定义
partial class Program
{
static void Main()
{
Print();
Duck ya = new RealDuck();
ya.Aget(2);
ya.X = 100;
ya.Aget(111);
Console.WriteLine(ya.X);
Console.WriteLine(ya[2]);
// output:
// Program 部分类方法
// x 的值被设置为 2
// x 的值被设置为 100
// x 的值被设置为 111
// x 的值 111 被获取了
// 111
// C
}
}
}
namespace TestA // 两个命名空间合并
{
partial class Program
{
static void Print()
{
Console.WriteLine("Program 部分类方法");
}
}
public abstract class Duck // 抽象类
{
protected int x;
public abstract int X {get; set;} // 抽象属性
public abstract void Aget(int n); // 抽象方法
public abstract event EEE eevent; // 抽象事件
public abstract string this[int index]{get; set;} // 抽象索引
}
class RealDuck : Duck // 多态
{
private string[] StrArray = {"A", "B", "C"};
private object eLock = new object();
private event EEE REevent; // 事件
public override event EEE eevent // 重写事件
{
add
{
REevent += value;
}
remove
{
REevent -= value;
}
}
public override string this[int index] // 重写索引器
{
get
{
if (index > StrArray.Length && index < 0)
return null;
else return StrArray[index];
}
set
{
if (index < StrArray.Length && index >= 0)
StrArray[index] = value;
}
}
public void OnEevent(string flag, int n) // 事件触发
{
if (REevent != null)
REevent(flag, n);
}
public RealDuck()
{
eevent += SetValue; // 事件订阅
eevent += GetValue; // 事件订阅
}
public override int X // 重写属性
{
get
{
OnEevent("Get", x); // 这里访问 X 才会触发, 直接访问 x 将不会触发
return x;
}
set
{
x = value;
OnEevent("Set", x); // 同理, x 初始值为 0 是也不会触发
}
}
public override void Aget(int n) // 重写方法
{
X = n;
}
public void GetValue(string flag, int n)
{
if (flag == "Get")
Console.WriteLine("x 的值 {0} 被获取了", n);
}
public void SetValue(string flag, int n)
{
if (flag == "Set")
Console.WriteLine("x 的值被设置为 {0}", n);
}
}
}