Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中,我们只能在接口类上使用抽象类#_C#_Asp.net_.net_Oop - Fatal编程技术网

C# 在c中,我们只能在接口类上使用抽象类#

C# 在c中,我们只能在接口类上使用抽象类#,c#,asp.net,.net,oop,C#,Asp.net,.net,Oop,我已经读过关于为什么我们使用接口类和为什么我们使用抽象类的文章,但仍然有一个问题,面试官一直在问下面两种情况- 给我一个只能使用抽象类而不能使用接口类的场景 给我一个场景,我只能使用接口类,而不能使用抽象类 请不要用重复标记,因为我搜索了很多地方,但没有得到最好的答案,我希望澄清我的困惑 给我一个场景,我只能使用抽象类,而不能 使用接口类 您希望提供一组抽象和具体的行为和属性: public class Polygon { // Sides is concrete publi

我已经读过关于为什么我们使用接口类和为什么我们使用抽象类的文章,但仍然有一个问题,面试官一直在问下面两种情况-

  • 给我一个只能使用抽象类而不能使用接口类的场景
  • 给我一个场景,我只能使用接口类,而不能使用抽象类
请不要用重复标记,因为我搜索了很多地方,但没有得到最好的答案,我希望澄清我的困惑

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

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

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

    public abstract double CalculateArea();
    public abstract double CalculatePerimeter();
}
给我一个场景,我只能使用接口类,而不能使用抽象类

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

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

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

public class Employee : Person, IHasRole
{
    public string Role { get; set; }
}
实际上,您不应该仅仅因为缺乏多重继承支持而选择何时使用抽象类或接口。您使用接口来定义API契约,而使用抽象类来定义不可实例化的顶级类,这些概念本身是不存在的。例如:有椅子吗?不,但是木椅可以

我建议你看看我不久前发表的一些文章:


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

我可以给你一个
模板方法的例子。我们不能使用接口来实现
模板方法
模式。为此,我们必须使用抽象类。根据GOF it
定义操作中算法的框架,将某些步骤推迟到子类。模板方法允许子类在不改变算法结构的情况下重新定义算法的某些步骤
。假设我们有一个由一些步骤组成的算法,我们想在将来重新定义一些步骤。
模板方法
模式的一般代码结构如下所示。首先利用抽象类定义算法的框架

 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();
    }
}

另外,
模板方法
模式也在asp.net页面生命周期事件的幕后实现。在接口方面,使用接口的优点是接口更灵活,因为一个类可以实现多个接口,但只能从一个基类派生。

这是某个公司的技术测试吗;DNo Matias,这不是一个测试,它是一个基于情景的面试问题,面试官大部分时间都会问这个问题。谢谢Matias,你的文章真的帮助我理解了我可以从哪里获得摘要class@RahulSharma我很高兴这对你来说是一个好的开始:)谢谢你阅读