在C#中,将具有静态字段的Java接口转换为抽象类是最佳选择吗?

4
public interface IHashStorage<T> {
    public static final float INITIAL_LOAD_FACTOR = 0.7f;
    public static final int INITIAL_CAPACITY = 149;
}

我有一段需要翻译成c#的代码。唯一看起来合适的解决方案是将其设置为抽象类。根据我的发现,使用只读比使用常量更安全:

public abstract class IHashStorage<T>
    {
        private readonly float INITIAL_LOAD_FACTOR = (float)0.7;

        private readonly int INITIAL_CAPACITY = 149;
    }

这个Java项目使用了装饰器模式和代理模式,将其从Java转换为C#可能需要使用更多的抽象类(目前只使用了接口)。我理论上知道它们之间的区别,但在C#中,我更多地使用了抽象类。我对Java不是很熟悉,我想知道您如何找到完成此任务的最佳解决方案,我的意思是在转换代码时需要牢记哪些主要点。


4
顺便说一下,将你提到的字段附加到接口上似乎是错误的(这也是为什么在C#中不允许的原因)。接口不应定义实现细节,负载因子和初始容量都是实现细节。这些应留给接口的具体实现,而不是接口本身。 - Chris Shain
小提示,当你赋值时不需要强制转换为浮点数。你仍然可以使用0.7f; - David L
2个回答

1
我会定义一个带有get属性的接口。 然后,让我的基类实现它并设置默认值。 然后,为每个实现Java接口的Java类扩展基类。 大致如此:
public interface IHashStorage<T>
{
    float InitialLoadFactor { get; }
    int InitialCapacity { get; }
}

public class HashStorageBase<T> : IHashStorage<T>
{
    private readonly float _initialLoadFactor = 0.7f;
    private readonly int _initialCapacity = 149;
    public float InitialLoadFactor
    {
        get { return _initialLoadFactor; }
    }

    public int InitialCapacity
    {
        get { return _initialCapacity; }
    }
}

public class HashStorage1<T> : HashStorageBase<T>
{
    ...
}

1

正如我在评论中所暗示的,C#中没有将字段(或任何其他实现细节)附加到接口的方法。除了将其制作为抽象类之外,您有两个选择:

  1. 将字段转换为(可能是只读的)接口属性,这将强制所有实现都指定它们。
  2. 将字段转换为定义在接口和/或实现上的自定义属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接