接口与抽象类
这几天在写一个记账管理的小程序,在这个程序中遇到了可能很多人都要遇到的问题。
一,接口的使用
二,接口和抽象类
问题一,接口的使用
如下的列子
interface IFly
{
void Fly();
}
class Bird : IFly
{
public void Eat()
{
}
#region 实现接口
public void Fly()
{
//用翅膀飞
}
#endregion
}
class Plan : IFly
{
#region IFly 成员
public void Fly()
{
//喷气飞行
}
#endregion
}
static class Mid
{
public static IFly GetBirdFly()
{
return new Bird();
}
public static IFly GetPlanFly()
{
return new Plan();
}
}
class Test
{
IFly Birds = Mid.GetBirdFly();
public void Tests()
{
Birds.Fly();
Birds.Eat();//错误。找不到相关的方法!
}
}
从上面的列子可以看出,当你申明了一个接口以后。你只是说明了 继承这个接口的类 可以做什么
具体怎么做。需要你再派生类中实现!
当你公布一个接口,并给出相应的静态方法时。使用者只能使用该接口的方法,而不可以使用那么是派
生类中的公共方法!
这时候会有人说。这样的话。抽象类 也可以实现。
没错。抽象类也可以完成上面的功能;
这时候我们再对上面的列子进行拓展!
比如。我们现在要详细区分各种类型的鸟,飞机
如,喷气飞机,战斗机
鹰,鸽子
这时我们要对上面的代码进行修改
先让我们完全用接口来实现
interface IFly
{
void Fly();
}
interface I攻击
{
void 攻击();
}
interface I吃加油
{
void 吃();
}
interface I乘坐
{
void 乘坐();
}
interface I送信
{
void 送信();
}
class 喷气飞机 : IFly, I乘坐,I吃加油
{
#region IFly 成员
public void Fly()
{
throw new NotImplementedException();
}
#endregion
#region II乘坐 成员
public void 乘坐()
{
throw new NotImplementedException();
}
#endregion
#region I吃加油 成员
public void 吃()
{
throw new NotImplementedException();
}
#endregion
}
class 战斗机 : IFly, I乘坐, I吃加油,I攻击
{
#region IFly 成员
public void Fly()
{
throw new NotImplementedException();
}
#endregion
#region I乘坐 成员
public void 乘坐()
{
throw new NotImplementedException();
}
#endregion
#region I吃加油 成员
public void 吃()
{
throw new NotImplementedException();
}
#endregion
#region I攻击 成员
public void 攻击()
{
throw new NotImplementedException();
}
#endregion
}
class 鹰 : IFly, I吃加油, I攻击
{
#region IFly 成员
public void Fly()
{
throw new NotImplementedException();
}
#endregion
#region I吃加油 成员
public void 吃()
{
throw new NotImplementedException();
}
#endregion
#region I攻击 成员
public void 攻击()
{
throw new NotImplementedException();
}
#endregion
}
class 鸽子 : IFly, I吃加油, I送信
{
#region IFly 成员
public void Fly()
{
throw new NotImplementedException();
}
#endregion
#region I吃加油 成员
public void 吃()
{
throw new NotImplementedException();
}
#endregion
#region I送信 成员
public void 送信()
{
throw new NotImplementedException();
}
#endregion
}
如上述的情况。我们如使用抽象类,则实现起来就比较复杂,因为类只能继承一个抽象类。
我们不得不为每个具体的实例类去写合适的抽象类。
但是似乎上面的代码又显得有些啰嗦。如 喷气飞机和战斗机,他们都有局部相同性,他们都是飞机,他
们要加油,都可以飞,都可以乘坐,唯一的不同是,喷气飞机不能攻击,而战斗机可以攻击。
鹰和鸽子也一样,他们都具有相同的行为,同时有具有不同的行为
我们修改下面的方法
interface IFly
{
void Fly();
}
interface I攻击
{
void 攻击();
}
interface I送信
{
void 送信();
}
abstract class 飞机
{
public abstract void 乘坐();
public abstract void 加油();
}
abstract class 鸟
{
public abstract void 吃();
}
class 喷气飞机 : 飞机,IFly
{
#region IFly 成员
public void Fly()
{
throw new NotImplementedException();
}
#endregion
public override void 乘坐()
{
throw new NotImplementedException();
}
public override void 加油()
{
throw new NotImplementedException();
}
}
class 战斗机 : 飞机,IFly,I攻击
{
#region IFly 成员
public void Fly()
{
throw new NotImplementedException();
}
#endregion
#region I攻击 成员
public void 攻击()
{
throw new NotImplementedException();
}
#endregion
public override void 乘坐()
{
throw new NotImplementedException();
}
public override void 加油()
{
throw new NotImplementedException();
}
}
class 鹰 : 鸟,IFly, I攻击
{
#region IFly 成员
public void Fly()
{
throw new NotImplementedException();
}
#endregion
#region I攻击 成员
public void 攻击()
{
throw new NotImplementedException();
}
#endregion
public override void 吃()
{
throw new NotImplementedException();
}
}
class 鸽子 :鸟, IFly, I送信
{
#region IFly 成员
public void Fly()
{
throw new NotImplementedException();
}
#endregion
#region I送信 成员
public void 送信()
{
throw new NotImplementedException();
}
#endregion
public override void 吃()
{
throw new NotImplementedException();
}
}
这次我们使用了抽象类来定义了两个抽象的事物,1 飞机,2鸟,他是抽象的,我们无法从飞机或者鸟中
给你一个具体的飞机,或者一只具体的鸟,但是所有的飞机和鸟都有这个抽象的行为,或者能力,
同时。不同的实例有具有不同的能力,如 攻击,和送信。
当然。我们可以再飞机的抽象类中加入一个飞的方法
但是我们使用接口来做是因为,鸟也可以飞,
这两类不同的事物再这里有相同的行为,只不过他们的实现不同而已。
我认为接口和抽象类并不存在用这个好,用那个不好的情况,我认为要从他们中级找出一个分界线,他
们在一个程序中应该根据程序的需求而相互扶助,已达到期望的效果
这就是我这几天所理解的接口和抽象类,不知道理解的是否正确,还希望大家指点!