c# - 具有空方法的接口(interface)与抽象类

标签 c# oop solid-principles

<分区>

我想了解什么时候应该使用接口(interface)还是抽象类。我正在考虑改进我的 MVC 应用程序设计并看到这篇文章:http://www.codeproject.com/Articles/822791/Developing-MVC-applications-using-SOLID-principles

在OCP一节中,作者给出了一个计算书籍价格的例子。原始代码如下所示:

enum Category
{
    student,
    corporate
}

class Book
{
    public double CalculatePrice(double price,Category category)
    {
        if (category == Category.corporate)
        {
            price = price- (price * 10);
        }
        else if (category == Category.student)
        {
            price = price - (price * 20);
        }

        return price;
    }

}

他的解决方案是这样的:

abstract class Book
{
    public abstract double CalculatePrice(double price);
}

class StudentBook : Book
{
    public override double CalculatePrice(double price)
    {
        return price - (price * 20);
    }
}

class CorporateBook : Book
{
    public override double CalculatePrice(double price)
    {
        return price - (price * 10);
    }
}

我在查看此解决方案时的问题是:

  1. 为什么在这里使用抽象类而不是接口(interface)?
  2. 如果将其更改为界面,会有什么不同?这真的很重要吗?

感谢您对理解这一点的任何帮助

最佳答案

这个例子是人为的,因为 Book 基类没有行为,它也可以是一个接口(interface)。然而,一个更现实的例子会有许多其他方法,例如

getAuthor()
getISBN()
isFiction()

如果这本书是学生版或公司版,这些行为大概不会改变,所以我们有一个包含许多标准行为的基类。因此 Book 将真正成为一个类,因为它具有由其派生类共享的有用行为。

当你有几组行为时,事情会变得有点复杂,例如,一本图书馆的书是一本书,但它也是一个可出租的东西,在 Java 中你不能从两个不同的基类继承。

在实践中,我发现接口(interface)比抽象基类多。我将接口(interface)定义为我的外向合约。那就是我写了一些代码来处理我的调用者给我的对象。我告诉他们我需要一些东西来满足这个接口(interface)。我不对如何做任何声明,只是给我一些可以计算价格的东西。

AbstractClass 更多的是为了实现某些代码的人的利益。我们实际上是在提供部分书面类(class),然后要求编码人员“填空”。我们可以有效地做到这一点的情况往往更为罕见。

关于c# - 具有空方法的接口(interface)与抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27192524/

相关文章:

javascript - 在类内部声明方法

oop - 耦合、内聚和迪米特定律

java - 尽可能晚或在它们所属的最近的大括号中声明局部变量?

c# - UnitOfWork & Generic Repository,带有自定义存储库的 SOLID 原则

c++ - 内存处理是否违反单一职责原则?

c# - 可以使用 EF 迁移更新生产数据库吗?

c# - 无法处理从 HTTP/HTTPS 协议(protocol)到其他不同协议(protocol)的重定向

c# - NGINX 反向代理背后的 ASP.NET MVC

c# - 消除 LINQ to Entities 中的循环

java - 当我们将职责分为不同的类别时,试图了解SRP