【问题标题】:Scenario where we can use abstract class only over interface class in c#我们只能在 C# 中的接口类上使用抽象类的场景
【发布时间】:2017-09-12 07:38:05
【问题描述】:

我已经阅读了为什么我们使用接口类以及为什么我们使用抽象类,但是面试官仍然在以下 2 个场景中不断提出一个问题-

  • 给我一个场景,我只能使用抽象类而不能使用接口类?
  • 给我一个场景,我只能使用接口类而不能使用抽象类?

请不要将此标记为重复,因为我搜索了很多地方,但我没有得到最好的答案,我希望能消除我的困惑?

【问题讨论】:

  • 这是某家公司的技术测试吗? ;D
  • No Matias,它不是一个测试,它是一个基于场景的面试问题,面试官大部分时间都会问

标签: c# asp.net .net oop


【解决方案1】:

给我一​​个场景,我只能使用抽象类而我不能 使用接口class

您想提供一组抽象和具体的行为和属性:

public class Polygon
{
    // Sides is concrete
    public int Sides { get; set; }

    public abstract double CalculateArea();
    public abstract double CalculatePerimeter();
}

给我一​​个场景,我只能使用接口 Class 而我不能使用抽象类?

您想提供一个必须由某个类履行的契约,并且整个类需要已经继承一个类。

由于 C# 幸运地不支持多继承,如果 EmployeePerson,它将无法继承具有面向角色的成员的抽象类。因此,您需要使用接口:

public interface IHasRole
{
     string Role { get; set; }
}

public class Employee : Person, IHasRole
{
    public string Role { get; set; }
}

实际上,您不应该仅仅基于缺乏多继承支持来选择何时使用抽象类或接口。您使用接口来定义 API 契约,而您使用抽象类来定义不可实例化的顶级类,这些是不能本身存在的概念。例如:椅子是否存在?不,但是木椅可以!

我建议你看看我前段时间发表的一篇文章:Why and when to use abstract classes

哦,请注意,每当您说 interface class 时,我是如何划掉 class 的。没有这样的结构:有类和接口。

【讨论】:

  • 感谢 Matias,您的文章确实帮助我了解了抽象类我可以去哪里
  • @RahulSharma 我很高兴这对你来说是一个好的开始:) 谢谢你阅读它
【解决方案2】:

我可以给你一个Template Method 模式的例子。我们不能使用接口实现Template Method 模式。为此,我们必须使用抽象类。根据 GOF 的说法是Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure。所以想象我们有一个由一些步骤组成的算法,我们希望在未来重新定义一些步骤。 Template Method 模式的一般代码结构如下所示。首先我们用抽象类定义算法的骨架。

 public abstract class AbstractClass
{
    protected abstract void Step1();
    protected abstract void Step2();
    protected abstract void Step3();

    // The "Template method". That is the skeleton of our algorithm
    public void TemplateMethod()
    {
        Step1();
        Step2();
        Step3();
    }
}

然后我们创建实际的实现来更改这些步骤。

public class ConcreteClassA : AbstractClass
{
    protected override void Step1()
    {
        //redefine Step1
    }

    protected override void Step2()
    {
        //redefine Step2
    }

    protected override void Step3()
    {
        //redefine Step3
    }
}

最后我们在客户端应用中使用它。

 class Program
{
    static void Main(string[] args)
    {
        ConcreteClassA operation = new ConcreteClassA();
        operation.TemplateMethod();
    }
}

顺便说一句,Template Method 模式也在 asp.net 页面生命周期事件的幕后实现。说到接口,使用接口的好处是接口更灵活,因为一个类可以实现多个接口,但只能从一个基类派生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2011-09-21
    • 2015-03-13
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多