我想构建一个漂亮的API(C#),让人们更容易消费,我想我以前见过这个并想知道如何做到这一点:
MyNamespace.Cars car = null;
if(someTestCondition)
car = new Honda();
else
car = new Toyota();
car.Drive(40);
这可能吗?如果是这样,需要做什么?
答案 0 :(得分:10)
Interface Car
{
void Drive(int miles);
}
class Honda : Car
{
...
}
class Toyota : Car
{
...
}
答案 1 :(得分:6)
你可以通过几种不同的方式做到这一点。您可以声明一个抽象基类,也可以使用对象实现的接口。我相信“C#”首选方法是拥有一个接口。类似的东西:
public interface ICar
{
public Color Color { get; set; }
void Drive(int speed);
void Stop();
}
public class Honda : ICar
{
#region ICar Members
public Color Color { get; set; }
public void Drive(int speed)
{
throw new NotImplementedException();
}
public void Stop()
{
throw new NotImplementedException();
}
#endregion
}
public class Toyota : ICar
{
#region ICar Members
public Color Color { get; set; }
public void Drive(int speed)
{
throw new NotImplementedException();
}
public void Stop()
{
throw new NotImplementedException();
}
#endregion
}
答案 2 :(得分:5)
我看到每个人都在推动界面/抽象基类更改。您提供的伪代码或多或少意味着您已经实现了这一点。
我会提出别的建议:
您需要创建一个“CarFactory”,它将返回基类/接口的特定实现。 Create方法可以将您的测试条件作为参数,以便您创建正确的汽车。
编辑:以下是来自MSDN的链接 - http://msdn.microsoft.com/en-us/library/ms954600.aspx
编辑:请参阅其他链接的评论。
答案 3 :(得分:1)
创建一个名为Cars的课程。给它Drive方法。扩展本田和丰田课程中的基础课程。
答案 4 :(得分:0)
namespace MyNameSpace
{
public interface Cars
{
public void Drive(int miles);
}
public class Honda : Cars
{
public void Drive(int miles) { ... }
}
public class Toyota : Cars
{
public void Drive(int miles) { ... }
}
}
答案 5 :(得分:0)
不要忘记命名空间,也请参阅我关于变量名称的问题的评论
namespace MyNamespace {
public interface Cars {
void Drive(int speed);
}
public class Honda : Cars {
public void Drive(int speed) {
}
}
public class Toyota : Cars {
public void Drive(int speed) {
}
}
}
答案 6 :(得分:0)
使用名为Drive()的抽象方法创建一个名为Cars的抽象类。对它进行子类化并添加实现。