我们只能在c#中的接口类上使用抽象类的场景

时间:2017-04-16 15:17:21

标签: c# asp.net .net oop

我已经读过为什么我们使用Interface类以及为什么我们使用Abstract类但是,有一个问题,面试官一直在询问2个场景 -

  • 给我一个我只能使用Abstract Class的场景,我不能使用Interface类?
  • 给我一个我只能使用Interface Class的场景,我不能使用Abstract类吗?

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

2 个答案:

答案 0 :(得分:1)

我可以举一个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页面生命周期事件中实现。在接口方面,使用接口的优点是接口更灵活,因为类可以实现多个接口,但只能从一个基类派生。

答案 1 :(得分:0)

  

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

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

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

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

给我一​​个场景,我只能使用Interface Class 而且我不能使用Abstract类?

您希望提供一个必须由某个类来完成的合同,并且整个类都需要继承一个类。

由于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

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