1 using System; //导入命名空间system中的类
2 using System.Collections.Generic; //导入System.Collections.Generic中的类
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 //using 导入命名空间
7 //使用微软提供的命名空间,使用里面的类
8
9
10
11
12
13
14
15
16
17 namespace CShapeDemo //命名空间CShapeDemo 包含了Program 等若干个类
18 {
19
20
21 //接口类
22 interface ICatchMice
23 {
24 void CatchMice();//默认是public ,且不能被private protected限定
25 }
26
27 interface IClimbTree
28 {
29 void ClimbTree();
30 }
31
32
33 abstract public class Pet //父类,当包含abstract时,类也要定义成abstract类
34 {
35 //构造函数
36 public Pet()
37 {
38 }
39
40 public Pet(string tempName)
41 {
42 this.name = tempName;
43 }
44
45
46 //行为
47 public void printname()
48 {
49 Console.WriteLine("Pet's name is " + name);
50 }
51
52 //重载
53 virtual public void Speek() //父类的虚函数
54 {
55 Console.WriteLine("Pet is Speaking !");
56 }
57
58 abstract public void Speek2();//抽象方法
59
60
61 //非静态数据
62 protected string name;
63
64 }
65
66
67 public class Dog : Pet,ICatchMice,IClimbTree //子类只能继承1个基类,但是可以继承多个接口类
68 {
69 //构造函数
70 public Dog(string name) : base(name) // base(name) 是基类的构造函数... 根据参数的类型和个数可以选择不同的父类构造函数
71 {
72 Num++;//静态计数器
73 }
74
75 new public void printname() //new 表示子类的这个函数和父类的函数重名,是个签名函数...有没有new都可以实现隐藏...最好是加上new
76 {
77 Console.WriteLine("宠物的 name is " + name);
78 }
79 //静态构造函数 :只负责初始化静态成员的数据
80 static Dog() //静态构造函数不能加public
81 {
82 Num = 0;
83 }
84 //静态函数
85 static public void ShowAllDogNum()
86 {
87 Console.WriteLine("一共创建了{0}个狗", Num);
88 }
89
90
91
92 //重写 //多态会重写,实现子类的差异化
93 public override void Speek() // public override 和 override public 是同一个意思 就像 const int 一样
94 {
95 // base.Speek();
96 Console.WriteLine("狗叫");
97 }
98
99 //抽象方法
100 sealed public override void Speek2() //抽象方法在子类必须用override关键字实现,实现差异化
101 {
102 Console.WriteLine("狗子在叫呢"); //sealed关键字表示该方法被继承的时候,也不允许Dog的子类重写它
103 }
104
105
106 //接口类的方法必须要实现,且 用public修饰
107 public void CatchMice()
108 {
109 Console.WriteLine("老子是狗,不会捉老鼠的");
110 }
111 public void ClimbTree()
112 {
113 Console.WriteLine("老子是狗,也不会爬树呀");
114 }
115
116
117
118 //静态数据
119 static int Num;
120
121
122 //自定义转换
123 public static implicit operator Cat(Dog dog) //public static implicit operator 特定写法,隐式转换
124 {
125 //把狗转换成了猫了
126
127 return new Cat(dog.name);
128 }
129
130
131 //委托
132 public void WagTail()
133 {
134 Console.WriteLine("狗狗摇尾巴");
135 }
136 }
137
138 public class Labrador : Dog
139 {
140 public Labrador(string name) : base(name)
141 {
142
143 }
144
145 }
146
147
148 //扩展类
149 static class PetGuide
150 {
151 //this+类名A 大概就是 这个函数就像A里面的方法一样,这就是扩展类的含义咯
152 static public void HowToFeedDog(this Dog dog) // this+ 类名的写法 :特定写法
153 {
154 Console.WriteLine("-------------------");
155 }
156 }
157
158 public class Cat : Pet
159 {
160 override public void Speek()
161 {
162 //base.Speek();
163 Console.WriteLine("猫叫");
164 }
165
166 //构造函数
167 public Cat(string name) : base(name)
168 {
169 }
170
171 //抽象方法
172 override public void Speek2()
173 {
174 Console.WriteLine("猫也会叫了");
175 }
176
177
178
179 //隐式转换
180 public static explicit operator Dog(Cat cat)
181 {
182 return new Dog(cat.name);
183 }
184
185 //委托
186 public void Innocent()
187 {
188 Console.WriteLine("傻猫在发呆呢");
189 }
190 }
191
192
193 class Program //类名
194 {
195 //委托
196 delegate void ActCute();
197
198
199 static void Main(string[] args)
200 {
201 //多态
202 //Pet dog = new Dog(); //父类引用指向 子类对象
203 //dog.name = "Hello";
204 //dog.printname();
205 //dog.Speek();
206
207 //Pet cat = new Cat();
208 //cat.name = "World";
209 //cat.printname();
210 //cat.Speek();
211
212 /////////////////////////////改进方法
213 Pet[] pets = new Pet[] { new Dog("Jack"), new Cat("Tom") }; //子类对象 被 父类对象引用
214 for (int i = 0; i < pets.Length; i++)
215 {
216 pets[i].printname();
217 pets[i].Speek();
218 pets[i].Speek2();
219 }
220
221
222
223 Dog dog = new Dog("nima");
224 dog.CatchMice();
225 dog.ClimbTree();
226
227 ICatchMice obj = (ICatchMice)dog; //子类对象转化成 接口对象
228 obj.CatchMice();
229
230 IClimbTree obj2 = (IClimbTree)dog; //子类对象转化成 接口对象
231 obj2.ClimbTree();
232
233 Dog.ShowAllDogNum();//通过类名直接调用静态函数
234
235 Dog dog3 = new Dog("dog3");
236 dog3.HowToFeedDog();//使用扩展类的方法
237
238
239
240 //测试装箱 , 并且可以验证出这是2个独立的对象,互不影响
241 {
242 int i = 3;
243 object oi = i; //隐式转换
244 Console.WriteLine("{0},{1}", i, oi);
245
246 i = 4;
247 Console.WriteLine("{0},{1}", i, oi);
248
249 oi = 10;
250 Console.WriteLine("{0},{1}", i, oi);
251
252 }
253
254 //拆箱
255 {
256 int i = 3;
257 object oi = i;
258
259 int j = (int)oi; //显式转换
260 Console.WriteLine("{0},{1},{2}", i, oi, j);
261
262
263 i = 11;
264 oi = 22;
265 j = 33;
266 Console.WriteLine("{0},{1},{2}", i, oi, j);
267 }
268
269
270
271
272
273 {
274 //自定义转换 : 转换自定义的结构或类
275
276 Dog dog4 = new Dog("Jack");
277 dog4.Speek();
278
279 Cat cat4 = dog; //把dog类型转换成了cat类型
280 cat4.Speek();
281
282
283 Dog dog5 = (Dog)cat4;
284 dog3.Speek();
285
286 }
287
288
289
290
291
292 {
293 //集合 : 就相当于c++中的stl
294
295
296 //数组
297 List<Dog> list = new List<Dog>();
298 list.Add(new Dog("A"));
299 list.Add(new Dog("B"));
300 list.Add(new Dog("C"));
301
302 list.RemoveAt(1);
303 for(int i=0;i<list.Count;++i)
304 {
305
306 list[i].printname();
307 }
308 list.Clear();
309
310
311
312 Console.WriteLine("map---------------");
313 //map
314 Dictionary<string, Dog> dic = new Dictionary<string, Dog>();
315 dic.Add("A",new Dog("A"));
316 dic.Add("B",new Dog("B"));
317 dic.Add("C",new Dog("C"));
318
319 dic["A"].printname();
320
321
322
323 Console.WriteLine("栈---------------");
324 //stack 栈 <特点: 先进后出,后进先出> 像羽毛球桶,一边开口
325 //出栈 就是出来
326 //入栈 就是进去
327 //栈顶
328 Stack<Pet> stack = new Stack<Pet>();
329 stack.Push(new Dog("A"));
330 stack.Push(new Cat("B")); //进栈
331
332 stack.Peek().printname(); //获取栈顶信息
333 stack.Pop(); //出栈
334 stack.Peek().printname();
335
336
337 Console.WriteLine("队列---------------");
338 //队列 <特点: 先进先出> 自来水管,2头开口
339 Queue<Pet> queue = new Queue<Pet>();
340 queue.Enqueue(new Dog("a")); //入队
341 queue.Enqueue(new Dog("b"));
342 queue.Enqueue(new Dog("c"));
343
344 Pet pet = null;
345 pet = queue.Dequeue(); //出队
346 pet.printname();
347 pet = queue.Dequeue();
348 pet.printname();
349 pet = queue.Dequeue();
350 pet.printname();
351
352 }
353
354
355
356
357
358 {
359 Console.WriteLine("队列---------------");
360 //委托
361 ActCute del = null;
362 Dog dog11 = new Dog("A");
363 Cat cat11 = new Cat("B");
364
365 del = dog11.WagTail;
366 del += cat11.Innocent; //这里是追加的操作,类似 c++的 <<操作符
367
368
369 del += () =>
370 {
371 //Console.WriteLine("匿名方法---------------");
372 // Console.WriteLine("lambada表达式---------------");
373 Console.WriteLine("do nothing ...这特么的就是 匿名方法和lambada表达式的结合体?");
374 };
375
376 del();
377
378 }
379
380
381
382 {
383 Console.WriteLine("事件---------------");
384 //事件
385 //发布者:通知某件事情发生的,就是发布者 我发布了微博
386 //订阅者:对某事关注的,就是订阅者 我关注了微博
387
388
389 //事件触发和注册
390 //事件发生时,会通知所有关注该事件的订阅者
391 //想在事件发生时被通知,必须注册以表示关注
392
393
394
395
396
397
398 }
399
400
401
402 //Ctrl+F5 等于c++的 system("pause");
403 Console.ReadKey();//这个也相当于是 system("pause");
404 }
405 }
406 }