在 C# 中的接口中实现属性

Bilal Shahid 2023年10月12日
  1. 使用简单代码块在界面中设置属性
  2. 在 C# 中对接口中的属性进行修改
  3. 在抽象类中实现具有多个接口继承的属性
  4. 结论
在 C# 中的接口中实现属性

今天,我们将学习如何在 C# 中的接口中实现属性。

C# 中的接口可以有许多不同的属性,以及指定我们应该如何在其中声明属性可用性的访问修饰符。该接口通常充当不同成员和对象的默认实现。

让我们开始看看我们可以在接口中实现属性的各种方式。

使用简单代码块在界面中设置属性

假设我们在 C# 中创建了一个名为 ENGINE 的接口,并带有 TORQUE 属性。我们将设置界面 ENGINE 如下:

public interface ENGINE {
  int torque { get; set; }
}

因此,我们为它的属性创建了一个具有适当的 getter 和 setter 的接口,称为 TORQUE。要使用该接口,我们必须继续定义一个可以实现该接口的类。

假设我们要定义一个包含 ENGINECAR 类。因此我们可以这样写:

class CAR : ENGINE {
  public int torque { get; set; }
}

请注意,在从此类创建对象时,CAR 类包含公共使用的 TORQUE 实现。要使用 CAR 对象,只需如下调用:

CAR x = new CAR();
x.torque = 989;
Console.WriteLine(x.torque);

因此,你可以使用不同的属性并将它们包含在界面中以供以后使用。这提供了更好的抽象层,并允许在不更改主要方法或类的情况下进行修改。

因此,如果我们想为 ENGINE 添加一个名为 LABEL 的新属性,我们可以在接口 ENGINE 中设置它,该接口可以在类 CAR 中使用。

整个代码如下所示:

using System;

namespace CA_ONE {
  class Program {
    public interface ENGINE {
      int torque { get; set; }
    }

    class CAR : ENGINE {
      public int torque { get; set; }
    }

    static void Main(string[] args) {
      CAR x = new CAR();
      x.torque = 989;
      Console.WriteLine(x.torque);
    }
  }
}

我们已将我们的项目命名为 CA_ONE;因此命名空间扩展并实现它。这里要注意的另一件事是,CARTORQUE 的实现可以在其函数内部有其他定义,例如 PRINT 方法或扭矩转换等。

在 C# 中对接口中的属性进行修改

在上面提供的解决方案中,我们提到了如何在我们的实现中定义其他方法。假设我们想扩展接口 ENGINE 中默认定义的 GETSET 方法。

我们将保持 ENGINE 不变,但倾向于修改扩展它的 CAR 类中的代码。

CAR 中,当我们设置 TORQUE 时,我们可能还想打印 "Torque is Set to _value_" 以便我们的用户知道 TORQUE 属性是否已正确设置。

因此,我们可以继续执行以下操作:

class CAR : ENGINE {
  private int torque_priv;
  public int torque {
    get { return this.torque_priv; }
    set {
      this.torque_priv = value;
      Console.WriteLine("This torque has been set to " + torque_priv);
    }
  }
}

现在在这里,让我们关注代码中发生的事情。我们注意到的第一件事是使用另一个名为 TORQUE_PRIV 的变量。

我们已经实例化了它,因为我们需要存储在以下代码中传递的 TORQUE 值:

x.torque = 989;

如果不是这样,你不使用 TORQUE_PRIV 变量,代码将陷入循环,递归移动以将值分配给 TORQUE 属性。另外,我们在这里使用了一种叫做 VALUE 的东西。

请注意,VALUE 不是变量,而是 C# 中的上下文关键字。VALUE 用于属性和访问声明的集合索引器中。

它获取客户端分配的值并将其分配给类的私有变量。通过这种方式,你可以修改和使用你的声明。

很多人会在 TORQUE 的 setter 中使用以下代码来表示抽象 CAR

this.torque_priv = torque;

对于 GETTER:

return torque;

由于陷入递归循环,这将出现如下错误:

Stack overflow.

在接口中实现任何属性的一般语法如下:

type name { get; set; }

因为多个类可以继承和使用接口,所以在抽象类中扩展和修改属性会更好。在实现不同的方法时,接口可以作为骨干结构,并提供关于什么和什么不扩展的基本概念。

请记住,接口不能直接使用。他们需要在运行代码时初始化和使用抽象类。

接口中的方法始终是公共的,不需要任何隐式访问修饰符。此外,接口可以从其他接口继承。

如果你试图在一个接口中实现一个属性,而另一个接口继承了之前定义的那个,你可以使用一个类来扩展后一个接口。

假设我们有一个接口 ENGINE,它继承 BOLTS,然后被类 CAR 继承。我们想根据每个 CAR 的螺栓尺寸安装一个扳手尺寸的应急套件。

因此,我们可以使用如下实现:

public interface BOLT {
  int size { get; set; }
}

public interface ENGINE : BOLT {
  int torque { get; set; }

然后在类 CAR 中扩展 BOLT 如下:

public int size {
  get { return wrench_size; }
  set {
    // set the wrench size
    wrench_size = value;
    Console.WriteLine("The wrench size to use should be: " + wrench_size);
  }
}

所以你可以看到任何接口都是继承的。如果在基接口中设置属性,则需要在扩展基接口或派生接口的所有类中实现该属性。

因此有必要扩展定义。

在抽象类中实现具有多个接口继承的属性

假设我们有两个界面:ENGINEWHEEL。它们都包含一个启动方法,告诉我们 ENGINEWHEEL 是否已启动。

让我们定义一个启动方法。

public interface WHEEL {
  void print();
}

public interface ENGINE : BOLT {
  int torque { get; set; }
  void print();
}

要在 CAR 类中扩展它,你需要编写一些函数,如下所示:

void WHEEL.print() {
  Console.WriteLine("Wheel has been started");
}
void ENGINE.print() {
  Console.WriteLine("Engine has been started!");
}

要调用它们,请在 main 中编写如下内容:

((WHEEL)x).print();

这是为了指定要使用 print() 方法的接口。

访问本教程中使用的完整代码于此处

结论

这就是如何在接口中使用属性的全部内容。可能有不同的情况下我们需要设置和使用一个属性; 因此,最好研究上述所有情况。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub