110,534
社区成员
发帖
与我相关
我的任务
分享
public interface IEat
{
void Eat();
}
public class Dog : IEat
{
public virtual void Eat()
{
Console.WriteLine("Dog eat");
}
}
public class WolfDog : Dog
{
public override void Eat()
{
Console.WriteLine("WolfDog eat");
}
}
class Tester
{
static void Main5(string[] args)
{
Dog[] dogs = new Dog[2];
dogs[0] = new Dog();
dogs[1] = new WolfDog();
IEat eat;
for (int i = 0; i < 2; i++)
{
eat = dogs[i];
eat.Eat();
}
}
}
上面是标准的方式,下面改变些
先按照 #5 答主的说法试验下
1 删除关键字 virtual 和子类中override关键字
运行结果:
不是想要的结果
再按照 #8 试验下
显示调用
编译不过
#9 的答主的回答然我想到了,前段时间找 "抽象类和接口 他们什么时候使用比较合适的" 时遇到的一个博客
https://blog.csdn.net/wab719591157/article/details/73741919
里面的需求是,在使用何种方式支付前,有个共同的判断(判断金额不能小于0),博主把这个重复判断的功能在先在基类中实现,然后再定义一个抽象函数,让不同支付行为在继承父类后再实现自己不同的方式,当时看后感觉写的很好,又在这里看到#9 答主答案,我把上面需求用答主的想表达的方式,写了一遍
public interface PayWay
{
bool pay(double money);
}
public abstract class AbstractPayWay : PayWay
{
private bool verify(double money)
{
return money > 0;
}
public virtual bool pay(double money)
{
bool verify = this.verify(money);
if (!verify)
{
Console.WriteLine("支付金额验证错误!");
return false;
}
return true;
}
//public abstract bool doPay();
}
public class WeixinPayWay : AbstractPayWay
{
public override bool pay(double money)
{
if (base.pay(money))
{
Console.WriteLine("这里无需校验支付金额,直接调用支付方法就行");
Console.WriteLine("微信支付成功");
return true;
}
return false;
}
}
public class ZhifubaoPayWay : AbstractPayWay
{
public override bool pay(double money)
{
if(base.pay(money))
{
Console.WriteLine("这里无需校验支付金额,直接调用支付方法就行");
Console.WriteLine("支付宝支付成功");
return true;
}
return false;
}
}
class Test
{
static void Main6(string[] args)
{
AbstractPayWay[] AbsPayWay =
{
new WeixinPayWay(),
new ZhifubaoPayWay()
};
PayWay payWayByWinXin= AbsPayWay[0];
payWayByWinXin.pay(111);//微信支付
PayWay payWayByZhiFuBao = AbsPayWay[1];
payWayByZhiFuBao.pay(112);//支付宝支付
}
}
下面是原博客中用抽象函数写的(我把原Java语言的表达换成了C#)
public interface PayWay
{
bool pay(double money);
}
public abstract class AbstractPayWay : PayWay
{
private bool verify(double money)
{
return money > 0;
}
public bool pay(double money)
{
bool verify = this.verify(money);
if (!verify)
{
Console.WriteLine("支付金额验证错误!");
return false;
}
return this.doPay();
}
public abstract bool doPay();
}
public class WeixinPayWay : AbstractPayWay
{
public override bool doPay()
{
Console.WriteLine("这里无需校验支付金额,直接调用支付方法就行");
Console.WriteLine("微信支付成功");
return false;
}
}
public class ZhifubaoPayWay : AbstractPayWay
{
public override bool doPay()
{
Console.WriteLine("这里无需校验支付金额,直接调用支付方法就行");
Console.WriteLine("支付宝支付成功");
return false;
}
}
class Test
{
static void Main4(string[] args)
{
AbstractPayWay[] AbsPayWay =
{
new WeixinPayWay(),
new ZhifubaoPayWay()
};
for (int i = 0; i < 2; i++)
{
AbsPayWay[i].doPay();
}
}
}
那问题来了,这两种方式哪个比较好些,或者实现这种功能还有更好的方式没,大家都说说自己看法吧