一个有关类基础知识的练习
看了一些有关类的贴子,感觉很多人对基本概念记的不牢,表述起来也是含糊不清的。尽管他们的想法是对的,可是表述的逻辑不太严谨。概念不清对编程有非常有害的。
自己也想为什么很多的人被斥之为眼高手低,或纸上谈兵?其实他们也很迷茫,不是他们不努力。我认为,主要是有这么一种风气,大家学习探讨都是在一种纯技术层次上,很少结合实际的例子。我看过大家很多代码,都是这样。久而久之,大家就形成了就技术说技术的习惯思维了,一旦真做起东西,就感会到无从下手。
这两天大家关于类的各个方面有很多的讨论。由于基础知识不清,或者说心中无底,这样说起话来,绕来绕去的,甚至象绕口令。其实,很多的概念单靠背是不行的,得靠练习写代码。当你从磕磕绊绊的、错误百出的练习中,练到能十分流利、精准美妙的把代码写出来,这些知识点也就烂熟于心了。
这是一个对类基础知识的练习,我是经过反复的练习。最后,不看参考书,10分钟内就可完成。这其中的一些名称我用了中文,是因为我没学习过英文,同时中文是自己的母语,理解起来也轻松不小。其实微软已经全面支持中文了,只不过大家觉得不够档次,用起来全都一样的。
--------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
//----------------------- 接口 ---------------------------------------------------------
public interface I面积 // 定义接口
{
int 面积 // 空属性
{
get;
}
}
//----------------------- 抽象类 -------------------------------------------------------
public abstract class 几何 // 定义抽象类
{
protected string m名称; // 声明字段
public string 名称 // 定义属性
{
get
{
return m名称;
}
set
{
m名称 = value;
}
}
}
//----------------------- 继承类 -------------------------------------------------------
public class 矩形 : 几何, I面积 // 从抽象类与接口中继承
{
protected int m长度, m宽度; // 声明字段
public virtual int 长度 // 定义虚拟属性
{
get
{
return m长度;
}
set
{
m长度 = value;
}
}
public virtual int 宽度 // 定义虚拟属性
{
get
{
return m宽度;
}
set
{
m宽度 = value;
}
}
public int 面积 // 实现继承于接口中的属性
{
get
{
return 长度 * 宽度;
}
}
}
//----------------------- 继承类 -------------------------------------------------------
public class 方形 : 矩形 // 再次继承
{
public override int 长度 // 重写属性,因方形的边长是相等的。
{
get
{
return base.长度;
}
set
{
base.长度 = value;
base.宽度 = value; // 将宽度等同长度
}
}
public override int 宽度 // 重写属性,因方形的边长是相等的。
{
get
{
return 长度; // 用长度代替宽度
}
set
{
长度 = value; // 用长度代替宽度
}
}
public int 边长 // 定义属性,前面已将长度与宽度设置为相等
{
get
{
return 长度;
}
set
{
长度 = value;
}
}
}
//--------------------------------------------------------------------------------------
class Program
{
public delegate string 委托(string arg);// 声明一个委托,接受并返回字符串
static string 我是谁(string s) // 定义义静态方法,接受并返回字符串
{
return "我的名字叫:" + s; // 返回处理后的字符串
}
static void 计算面积(I面积 p) // 定义静态方法,接受一个接口参数
{
Console.WriteLine("{0}的面积是: {1}", ((几何)p).名称, p.面积);
// 显示
}
static void Main(string[] args) // 程序入口
{
矩形 矩 = new 矩形(); // 实例类
矩.名称 = "矩形"; // 赋值
矩.长度 = 20;
矩.宽度 = 10;
方形 方 = new 方形(); // 实例类
方.名称 = "方形"; // 赋值
方.边长 = 15;
I面积[] j = new I面积[2]; // 实例接口类型的数组
j[0] = 矩; // 赋值
j[1] = 方;
foreach ( I面积 a in j ) // 循环读取
{
计算面积(a); // 调用静态方法,显示结果
Console.WriteLine();
}
string 名1 = 矩.名称; // 定义变量
string 名2 = 方.名称;
委托 d = new 委托(Program.我是谁); // 初始委托,并用接受一个方法
Console.WriteLine(d(名1)); // 关键理解:用委托接受的方法来处理名1
Console.WriteLine();
Console.WriteLine(d(名2)); // 关键理解:用委托接受的方法来处理名2
Console.ReadKey();
}
}
}
这个程序您如果能运行几次,就会对类中的各种成员有深刻的感受了。