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

C# C如何在具体类不同的地方实现接口?

C# C如何在具体类不同的地方实现接口?,c#,interface,C#,Interface,首先,很抱歉,我的问题的标题不好 在我的应用程序中,我使用标准。这些标准可以看作是控制。我有文本框,但也有单选按钮和复选框 我使用接口来实现这一点: ICriteria是所有criteria类继承自的基本接口 TextType继承自ICriteria。RadioType也继承自ICriteria。但是,RadioType必须有选择 TextType和RadioType都有一些相同的属性 我的问题是,我不知道如何实现这一点。我的意思是,我可以向ICriteria添加一些影响选择的方法和属性,但是T

首先,很抱歉,我的问题的标题不好

在我的应用程序中,我使用标准。这些标准可以看作是控制。我有文本框,但也有单选按钮和复选框

我使用接口来实现这一点:

ICriteria是所有criteria类继承自的基本接口

TextType继承自ICriteria。RadioType也继承自ICriteria。但是,RadioType必须有选择

TextType和RadioType都有一些相同的属性

我的问题是,我不知道如何实现这一点。我的意思是,我可以向ICriteria添加一些影响选择的方法和属性,但是TextType也必须继承这些方法和属性。我认为这不好,因为TextType没有选择


实现这一点的最佳方法是什么?

为什么不使用接口层次结构

public interface ICriteria
{
    void SomeCriteriaMethod();
}

public interface IChoices : ICriteria
{
    void SomeChoicesMethod();
}
然后像这样使用它

foreach (ICriteria criteria in criterias)
{
    // something
    var choice = criteria as IChoices;
    if (choice != null)
        // do something else
}

为什么不使用接口的层次结构

public interface ICriteria
{
    void SomeCriteriaMethod();
}

public interface IChoices : ICriteria
{
    void SomeChoicesMethod();
}
然后像这样使用它

foreach (ICriteria criteria in criterias)
{
    // something
    var choice = criteria as IChoices;
    if (choice != null)
        // do something else
}

这里有两个选项:

您可以有两个不同的接口或ISomeMoreAdvancedInterface:ISomeBasicInterface-其中一个接口允许简单场景,而第二个接口具有获取选项的额外方法


或者:您可以使用像从TypeConverter复制GetStandardValuesSupported这样的方法-如果返回true,则调用GetStandardValues方法是合理的;如果返回false,则调用方不应调用GetStandardValues,它可能会抛出NotSupportedException,但编写良好的调用方不应看到它们,因为它们正在观察*Supported。

这里有两个选项:

您可以有两个不同的接口或ISomeMoreAdvancedInterface:ISomeBasicInterface-其中一个接口允许简单场景,而第二个接口具有获取选项的额外方法


或者:您可以使用像从TypeConverter复制GetStandardValuesSupported这样的方法-如果返回true,则调用GetStandardValues方法是合理的;如果返回false,调用方不应该调用GetStandardValues,它可能会抛出NotSupportedException,但是编写良好的调用方不应该看到它们,因为它们正在观察*Supported。

由于缺少详细信息,很难确定,但看起来您试图在一个类中混合表示层和业务逻辑。最好有一个ICriteriaEditor接口,该接口将ICriteria作为属性和工厂包含,该工厂将根据ICriteria类型创建适当的ICriteriaEditor对象。
无论如何,您必须在细节上更加具体。

由于缺乏细节,很难确定,但看起来您试图将表示层和业务逻辑混合在一个类中。最好有一个ICriteriaEditor接口,该接口将ICriteria作为属性和工厂包含,该工厂将根据ICriteria类型创建适当的ICriteriaEditor对象。
无论如何,您必须在细节上更加具体。

您应该使用哪些选项?@Martijn不太诚实,您应该使用哪些选项?@Martijn不太诚实+1-您可以在不使用ICriteria派生的IChoice的情况下执行此操作-然后RadioType必须继承多个接口。但是考虑到OP的使用情况,您的派生选项可能是更好的选项。+1-您可以在不使用ICriteria派生的IChoice的情况下执行此操作-然后RadioType必须继承多个接口。但是考虑到OP的用例,您的派生选项可能是更好的选项。那么类应该创建控件并将它们返回到GUI,这将把控件添加到GUI界面ICriteria负责什么?现在看来抽象工厂将匹配这种情况。那么这些类应该创建控件并将它们返回到GUI,这将把控件添加到GUI界面ICriteria负责什么?现在看来,抽象工厂将符合这种情况。