在 C# 中的接口中实现属性
今天,我们将学习如何在 C# 中的接口中实现属性。
C# 中的接口可以有许多不同的属性,以及指定我们应该如何在其中声明属性可用性的访问修饰符。该接口通常充当不同成员和对象的默认实现。
让我们开始看看我们可以在接口中实现属性的各种方式。
使用简单代码块在界面中设置属性
假设我们在 C# 中创建了一个名为 ENGINE
的接口,并带有 TORQUE
属性。我们将设置界面 ENGINE
如下:
public interface ENGINE {
int torque { get; set; }
}
因此,我们为它的属性创建了一个具有适当的 getter 和 setter 的接口,称为 TORQUE
。要使用该接口,我们必须继续定义一个可以实现该接口的类。
假设我们要定义一个包含 ENGINE
的 CAR
类。因此我们可以这样写:
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
;因此命名空间扩展并实现它。这里要注意的另一件事是,CAR
中 TORQUE
的实现可以在其函数内部有其他定义,例如 PRINT
方法或扭矩转换等。
在 C# 中对接口中的属性进行修改
在上面提供的解决方案中,我们提到了如何在我们的实现中定义其他方法。假设我们想扩展接口 ENGINE
中默认定义的 GET
和 SET
方法。
我们将保持 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);
}
}
所以你可以看到任何接口都是继承的。如果在基接口中设置属性,则需要在扩展基接口或派生接口的所有类中实现该属性。
因此有必要扩展定义。
在抽象类中实现具有多个接口继承的属性
假设我们有两个界面:ENGINE
和 WHEEL
。它们都包含一个启动方法,告诉我们 ENGINE
或 WHEEL
是否已启动。
让我们定义一个启动方法。
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()
方法的接口。
结论
这就是如何在接口中使用属性的全部内容。可能有不同的情况下我们需要设置和使用一个属性; 因此,最好研究上述所有情况。
相关文章
在 C# 中注释文本块
发布时间:2024/02/01 浏览次数:192 分类:编程语言
-
本教程教你如何在 C# 中注释一段文本或代码。作为注解的注释处于更高的抽象级别,编译器在编译 C# 代码时会忽略它。
在 C# 中从子类的构造函数调用基类的构造函数
发布时间:2024/02/01 浏览次数:190 分类:编程语言
-
base 关键字可用于从 C# 中的子类的构造函数调用基类的构造函数。本教程将讨论从 C# 中的子类的构造函数调用基类的构造函数的方法。
C# 中的结构体和类之间的区别
发布时间:2024/02/01 浏览次数:175 分类:编程语言
-
结构体是驻留在堆栈中的值类型变量,而类是驻留在堆中的引用类型变量。在本教程中,我们将讨论 C# 中的结构体和类之间的区别和相似之处。
在 C# 中复制一个对象
发布时间:2024/02/01 浏览次数:120 分类:编程语言
-
有两种主要方法可用于在 C# 中创建对象的单独副本,MemberWiseClone()函数和参数化构造函数方法。在 C# 中使用 MemberWiseClone() 方法复制对象
C# 中的 Java final 等效关键字
发布时间:2024/02/01 浏览次数:59 分类:编程语言
-
C# 中有两个不同的关键字,它们等效于 Java 中的 final 关键字,用于类和函数的 sealed 关键字以及用于字段的 readonly 关键字。本教程将讨论与 Java 中的 final 关键字等效的 C# 关键字。Java final 关键
C# new vs override
发布时间:2024/02/01 浏览次数:80 分类:编程语言
-
override 关键字用于向其父对象显示虚函数的子实现,而 new 关键字用于对其父类对象隐藏子实现。C# 中的 new 关键字 new 关键字 在 C# 中非常常见。
在 C# 中执行带参数的存储过程
发布时间:2024/02/01 浏览次数:196 分类:编程语言
-
本文讨论如何在 C# 中调用带参数的存储过程。在本指南中,你将了解如何在 C# 中使用参数执行/调用存储过程,这意味着如何在存储过程中传递参数。