它是接口类的正确泛化关联

时间:2015-08-14 10:05:40

标签: c# interface generalization

正如ttitle所说,我问这是否是一个很好的编程/设计方式。

我有一个类,它可以只是一个接口(只有一个抽象方法和几个属性)

作为我的案例,这是类似的:

我们有一辆大型轿车而不是卡车,汽车,摩托车...... 并有一个抽象方法void move()

我可以将CAR设计为接口,将其他具体类设计为CAR类的概括吗?或者这是错的?

public interface Car{
  private int length;
  private float speed;

  public void move();
}

public class truck : Car{
  //Constructor
  public Car(int size)
  {
     length=size;
  }

  public void move()
  {
     //Move code
  }
}

然后

Car myCar = new truck();
myCar.move();

是不是?

2 个答案:

答案 0 :(得分:1)

你在这里混淆了“抽象”和“界面”这两个术语。

通过它实现的接口引用类的实例是完全正确的。在这里,您可以看到一个界面ICookieFactory,其中包含抽象Cookie s:

public interface ICookieFactory 
{
    Cookie BakeCookie(); 
}

public class ChocolateChipCookieFactory : ICookieFactory
{
    public Cookie BakeCookie()
    {
        return new ChocolateChipCookie();
    }
}

public abstract class Cookie
{
    public abstract IEnumerable<Crumb> Crumble();
}

public class ChocolateChipCookie : Cookie
{
    public override IEnumerable<Crumb> Crumble()
    {
        ...
    }
}

ICookieFactory factory = new ChocolateChipCookieFactory();
Cookie cookie = factory.BakeCookie();
foreach (Crumb crumb in cookie.Crumble())
{
    ...
}

接口告诉它实现它必须支持哪些方法或属性,但不能提供任何实现代码本身。您无法在界面中定义字段。

抽象类可以包含任意数量的字段和方法,以及必须由子类重写的abstract方法。

单个类可以实现多个接口,但只能从单个抽象类继承。

答案 1 :(得分:0)

据我所知,是的,创建一个子类可能是泛化关联的接口的可能性和权利。

但在我的情况下,并且由于C.Evenhuis的唯一答案,我意识到创建一个抽象类会更好(所以我可以结合一些子类必须覆盖的抽象方法,并使用一些具体方法孩子可以覆盖或简单地使用)。