Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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#_Oop_Uml_Datadesign - Fatal编程技术网

C# 使接口扩展类

C# 使接口扩展类,c#,oop,uml,datadesign,C#,Oop,Uml,Datadesign,我有以下情况,但我觉得我做错了什么。。。 据《邮报》报道,我为字段使用了一个界面。字段接口继承自样式类,字段1、2和3继承自字段接口。我想用两种不同类型的字段构造一个标签对象,每个字段都有自己的样式。我不确定这样做是否正确,尤其是因为我在尝试编译时遇到以下错误:在接口列表中键入'Style'不是接口 我的代码: public interface Field : Style { int Xpos { get; set; } int Ypos { get; set; } i

我有以下情况,但我觉得我做错了什么。。。

据《邮报》报道,我为
字段使用了一个界面。
字段
接口继承自
样式
类,字段1、2和3继承自
字段
接口。我想用两种不同类型的字段构造一个
标签
对象,每个字段都有自己的样式。我不确定这样做是否正确,尤其是因为我在尝试编译时遇到以下错误:
在接口列表中键入'Style'不是接口

我的代码:

public interface Field : Style
{
    int Xpos { get; set; }
    int Ypos { get; set; }
    int Zindex { get; set; }
}
解决这个问题的最好办法是什么

编辑


我知道从接口继承一个类是不可能的,但是这里最好的方法是什么?

我想你正在努力解决的是接口的用途。接口为类定义了实现类中将存在哪些公共成员和方法。这允许您创建类型(接口名称)的变量,然后为其分配实现接口的任何实例化类的值


为了改进设计,可以在接口和标签类中定义三个属性(x、y、z),并实现字段接口。它不会有字段列表,但更愿意实现它,通过draw方法强制它具有属性x、y和z。然后,您的样式将有一个字段列表,其中实现字段接口的任何内容都可以添加到此列表中。然后,您可以放心地迭代此列表并调用draw并知道它在那里,而不管draw实际做什么。

查找/创建一个由样式使用的接口,并在字段接口上继承该接口

注意,字段接口应命名为IField

如果风格是你自己的类

public interface IStyle
{
    /* Style properties */
}
public class Style : IStyle
{
    /* Style implementations */
}

public interface IField : IStyle
{
    int Xpos { get; set; }
    int Ypos { get; set; }
    int Zindex { get; set; }
}

public class Field : Style, IField
{
    public int Xpos { get; set; }
    public int Ypos { get; set; }
    public int Zindex { get; set; }
}

如前所述,接口不能扩展类,因此我将尝试另一种模式。我不知道这是否很标准,但当涉及到类似的场景时,我选择“接口+基类”模式。您定义:

  • 具有所需最少字段/方法的接口
  • 具有公共函数性的基类(可选抽象类)
这样,当您想要添加特性时,您可以选择是扩展基类还是从头实现接口

在您的情况下,这取决于可能扩展的方向,但示例结构可能是:

  • IStyle接口
  • 使用抽象绘制方法实现IStyle和的StyleBase抽象类
  • IField接口扩展IStyle
  • 实现IField和with的FieldBase抽象类以及抽象绘制方法
  • 标签类扩展样式库并带有列表
  • Field1、Field2、Field3类扩展FieldBase

正如我所说的,这只是一个例子,它取决于潜在的扩展点。

当继承失败,或者造成的麻烦比它解决的要多时,组合是最有可能的方式

由于您并没有对Draw()方法说太多,所以我假设它与这里的问题无关

我认为解决这个问题的一个好方法是用样式类组合字段接口和标签类

我的建议是这样的:

public interface IField {
    Style style {get;set}
    /* Your property */
}
public class Label {
    Style style {get;set}
    IField field {get;set}
    /* Your property */
}

字段不应具有样式-因此应为属性。您并不真正希望将样式扩展到字段。但是你不能让一个接口继承一个类。接口不能从一个类继承,只能从其他接口继承。@juharr我想哈哈,但还是要谢谢你!如何改进?使接口扩展类。。。这是不可能的,您可以让Field1-3继承样式并实现Field接口。另一方面,考虑将IField字段重命名为接口的命名约定是将一个资本i放在名称的开头。所有的类都是我自己制作的,所以我不指任何现有的类;我已经用一个为样式IStyle创建接口的示例更新了代码。IStyle然后由接口IField继承。Field类继承自Style类并实现IField接口。