【问题标题】:Inner class within Interface in C#C#接口中的内部类
【发布时间】:2019-12-21 22:59:47
【问题描述】:

下面的问题展示了如何在java中实现一个包含类的接口:

inner class within Interface

Java 中的代码是:

public interface A {
    class B {
    }
}

我希望在 C# 中也能实现同样的事情,尽管我还没有让任何东西工作。

作为参考,我有一个类可以查找键值,但键的命名方式不便于理解。我想在编译时查找键,所以界面类似于:

interface Lookup {
    class Keys {
        string SomeKey() => "0"
    }
}

这意味着我想我有两个问题:

  1. 是否可以有一个包含类的接口?
  2. 有没有更好的方法可以在编译时可靠引用的两个字符串(或任何其他值)之间进行查找?

【问题讨论】:

  • 第二个问题“有没有更好的方法在两个字符串之间进行查找”我建议看一下.NET的Dictionary<,> class框架。听起来这可能就是您正在寻找的。​​span>
  • 1-不可能。 2-为什么不使用 Dictionary
  • @OliverRadini 那么您是否考虑过简单地使用自定义 enum 类型作为字典的键?
  • 为什么你没有一个常量列表? (见我的回答)
  • 从你的回答来看,你可能有一个XY Problem

标签: c#


【解决方案1】:

在 C# 的接口中不能有类。 C# 中的接口非常简单,只提供功能契约。

如果您想在两个字符串之间进行映射,Dictionary<string, string> 可能对您有用。

【讨论】:

  • 我很困惑,因为这里的答案并不那么老,但他们都同意这是不可能的 - 但我现在正在我的 IDE 中查看它。
【解决方案2】:

简单地说,你不能在接口中拥有一个类。

从您的 cmets 中,您正在谈论为键提供有限的可用字符串列表,所以我想知道您是否实际上不是在寻找字符串/字符串查找,而只是想要一种方便的方式来引用固定列表字符串。所以你只需要一个带有常量的类:

public static class Strings 
{
    public const string AString = "A";
    public const string BString = "B";
    public const string CString = "C";
}

这样访问:

var s = Strings.AString;

【讨论】:

  • 常量列表听起来最接近我目前正在寻找的东西,我想数据结构更类似于enum,除了字符串作为值;优点是我可以对所有这些值进行分组。它们可以单独定义,但是接口为所需的每个键都有一个新成员,而不是包含所有键的单个数据结构
  • 是的,它有点像带有字符串的枚举。我已经修改了答案。
【解决方案3】:

接口本身不能有任何实例数据。但是它的实现可以有它需要的任何实例数据。

例如,一个可能会给您一些见解的随机示例:

public class SomeClass
{
    public string Key {get; set;}
}

public interface ISomeInterface
{
    string Value { get; set; }
    SomeClass SomeClass { get; set;}
}

public class SomeInterfaceImplementation : ISomeInterface
{
    public SomeInterfaceImplementation()
    {
        SomeClass = new SomeClass()
        {
            Key = "ABC"
        };
    }
    public string Value { get; set; }
    public SomeClass SomeClass { get; set; }
}

public class Program
{

    public static void Main()
    {
        var example = new SomeInterfaceImplementation()
        {
            Value = "A value",
        } as ISomeInterface;
        Console.WriteLine($"{example.SomeClass.Key} has value '{example.Value}'");
    }
}

在示例中,默认构造函数“生成”一个 ABC 键。我们可以按照您的逻辑要求的任何方式实现这一点。但是您也有一个需要“SomeClass”的合同,并且它的关键是存在的。

任何你想使用契约的地方,只要接受接口并且不是一个实现类。

另外,请随时play with the fiddle:

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 2011-01-24
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多