接口学习心得(Interface)
今天看了几篇接口的文章,看着看着,忽然有种感觉,我一直都理解错了!
我本来今天搜索文章的目的,是想查找一下,如何编写一个接口。可是看了几篇文章后,我发现,其实我这个问题的提出,就说明了我没有理解接口的用途。实际上,要明白接口,要先弄明白为什么要编写接口。
我们要编写接口,是因为我们要编写的方法需要使用接口。我们编写接口的目的,是为了定制一种规范,如果用户写的类满足这种规范,那么这个类的实例,就可以被我们写的方法所调用。以此来实现代码的通用性。
看不明白没关系,往下看,下面的例子就是为了弄明白上面这段蓝字的。
现在我们需要做一个类,这个类可以比较两个正方形面积的大小。那么我们会这么写:
但如果写的更通用些,这两个形状就不一定非得是正方形(Square类的对象)。我们可以设计一个类,可以比较任何形状的面积。
你可能会想。这样不能用泛型吗?事实上,使用泛型可以将对象传过来。但无法使用obj1和obj2的.Area属性。因为<T>的T类型中并不一定包含.Area属性。
这个时候我们才应该考虑设计接口。也就是说,接口是在设计类的方法时定义的。任何对象,想可以被这个方法所操作,必须实现这个接口,也只需要实现这个接口,就可以被这个方法所调用。而不用再去规定具体的类名。如:正方形(Square)。
我们应该设计一个接口,接口里规定必须有Area属性,我才可以比较。然后,让别人去实现这个接口。然后,所有实现了这个接口的类的对象,都可以被我们设计的这个类的方法所比较了。我们不用去管这个实现接口的类里面还有什么其他的方法。我们不管。我们只需要知道的是,两个对象,必须都有Area属性,我才可以比较面积。至于,这个对象有没有什么其他的属性或方法,不关我的事。我比较面积,只需要使用Area属性。
OK,那么,我们修改后的程序,是这样的:
namespace CompareTest
{
class Program
{
static void Main(string[] args)
{
Square sq = new Square(8);
Triangle tr = new Triangle(12, 9);
CompareTwo ct = new CompareTwo();
ct.ShowCompareResult(sq, tr);
Console.ReadKey();
}
}
public class Square : IHasArea
{
private int m_side;
public Square(int side)
{
this.m_side = side;
}
public int Area
{
get { return m_side * m_side; }
}
}
public class Triangle : IHasArea
{
private int m_side;
private int m_height;
public Triangle(int BottomSide, int Height)
{
this.m_side = BottomSide;
this.m_height = Height;
}
public void Draw()
{
//比如这儿是把这个三角形画出来的函数,就不写了
}
IHasArea 成员
}
public interface IHasArea
{
int Area
{
get;
}
}
public class CompareTwo
{
public void ShowCompareResult(IHasArea obj1, IHasArea obj2)
{
if (obj1.Area > obj2.Area) //为了简单,不考虑相等的情况了
Console.WriteLine("{0}比{1}大", obj1.Area, obj2.Area);
else
Console.WriteLine("{0}比{1}大", obj2.Area, obj1.Area);
}
}
}
总结一下:
接口是为了减低耦合度,只需要必要的特性就可以运算的规范。定义接口是由开发人员定义,目的是使方法调用时,可以更灵活。实现接口是由方法的使用者实现,目的是使用开发者编写的方法。
我本来今天搜索文章的目的,是想查找一下,如何编写一个接口。可是看了几篇文章后,我发现,其实我这个问题的提出,就说明了我没有理解接口的用途。实际上,要明白接口,要先弄明白为什么要编写接口。
我们要编写接口,是因为我们要编写的方法需要使用接口。我们编写接口的目的,是为了定制一种规范,如果用户写的类满足这种规范,那么这个类的实例,就可以被我们写的方法所调用。以此来实现代码的通用性。
看不明白没关系,往下看,下面的例子就是为了弄明白上面这段蓝字的。
现在我们需要做一个类,这个类可以比较两个正方形面积的大小。那么我们会这么写:
namespace CompareTest
{
class Program
{
static void Main(string[] args)
{
Square s1 = new Square(8), s2 = new Square(9);
CompareTwo ct = new CompareTwo();
ct.ShowCompareResult(s1, s2);
Console.ReadKey();
}
}
public class Square
{
private int m_side;
public Square(int side)
{
this.m_side = side;
}
public int Area
{
get { return m_side * m_side; }
}
}
public class CompareTwo
{
public void ShowCompareResult(Square obj1, Square obj2)
{
if (obj1.Area > obj2.Area) //为了简单,不考虑相等的情况了
Console.WriteLine("{0}比{1}大", obj1.Area, obj2.Area);
else
Console.WriteLine("{0}比{1}大", obj2.Area, obj1.Area);
}
}
}
{
class Program
{
static void Main(string[] args)
{
Square s1 = new Square(8), s2 = new Square(9);
CompareTwo ct = new CompareTwo();
ct.ShowCompareResult(s1, s2);
Console.ReadKey();
}
}
public class Square
{
private int m_side;
public Square(int side)
{
this.m_side = side;
}
public int Area
{
get { return m_side * m_side; }
}
}
public class CompareTwo
{
public void ShowCompareResult(Square obj1, Square obj2)
{
if (obj1.Area > obj2.Area) //为了简单,不考虑相等的情况了
Console.WriteLine("{0}比{1}大", obj1.Area, obj2.Area);
else
Console.WriteLine("{0}比{1}大", obj2.Area, obj1.Area);
}
}
}
但如果写的更通用些,这两个形状就不一定非得是正方形(Square类的对象)。我们可以设计一个类,可以比较任何形状的面积。
你可能会想。这样不能用泛型吗?事实上,使用泛型可以将对象传过来。但无法使用obj1和obj2的.Area属性。因为<T>的T类型中并不一定包含.Area属性。
这个时候我们才应该考虑设计接口。也就是说,接口是在设计类的方法时定义的。任何对象,想可以被这个方法所操作,必须实现这个接口,也只需要实现这个接口,就可以被这个方法所调用。而不用再去规定具体的类名。如:正方形(Square)。
我们应该设计一个接口,接口里规定必须有Area属性,我才可以比较。然后,让别人去实现这个接口。然后,所有实现了这个接口的类的对象,都可以被我们设计的这个类的方法所比较了。我们不用去管这个实现接口的类里面还有什么其他的方法。我们不管。我们只需要知道的是,两个对象,必须都有Area属性,我才可以比较面积。至于,这个对象有没有什么其他的属性或方法,不关我的事。我比较面积,只需要使用Area属性。
OK,那么,我们修改后的程序,是这样的:
namespace CompareTest
{
class Program
{
static void Main(string[] args)
{
Square sq = new Square(8);
Triangle tr = new Triangle(12, 9);
CompareTwo ct = new CompareTwo();
ct.ShowCompareResult(sq, tr);
Console.ReadKey();
}
}
public class Square : IHasArea
{
private int m_side;
public Square(int side)
{
this.m_side = side;
}
public int Area
{
get { return m_side * m_side; }
}
}
public class Triangle : IHasArea
{
private int m_side;
private int m_height;
public Triangle(int BottomSide, int Height)
{
this.m_side = BottomSide;
this.m_height = Height;
}
public void Draw()
{
//比如这儿是把这个三角形画出来的函数,就不写了
}
IHasArea 成员
}
public interface IHasArea
{
int Area
{
get;
}
}
public class CompareTwo
{
public void ShowCompareResult(IHasArea obj1, IHasArea obj2)
{
if (obj1.Area > obj2.Area) //为了简单,不考虑相等的情况了
Console.WriteLine("{0}比{1}大", obj1.Area, obj2.Area);
else
Console.WriteLine("{0}比{1}大", obj2.Area, obj1.Area);
}
}
}
总结一下:
接口是为了减低耦合度,只需要必要的特性就可以运算的规范。定义接口是由开发人员定义,目的是使方法调用时,可以更灵活。实现接口是由方法的使用者实现,目的是使用开发者编写的方法。
张旋(zxsoft)
如对本文有什么疑问,请在下面写下留言,谢谢!