Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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#中转换抽象类中带有静态字段的java接口是最佳选择吗? 公共接口存储{ 公共静态最终浮动初始荷载系数=0.7f; 公共静态最终int初始容量=149; }_Java_C#_Interface_Field_Abstract Class - Fatal编程技术网

在c#中转换抽象类中带有静态字段的java接口是最佳选择吗? 公共接口存储{ 公共静态最终浮动初始荷载系数=0.7f; 公共静态最终int初始容量=149; }

在c#中转换抽象类中带有静态字段的java接口是最佳选择吗? 公共接口存储{ 公共静态最终浮动初始荷载系数=0.7f; 公共静态最终int初始容量=149; },java,c#,interface,field,abstract-class,Java,C#,Interface,Field,Abstract Class,我有上面的代码需要翻译成c。唯一合适的解决方案似乎是将其设置为抽象类。从我发现的情况来看,使用readonly比const更安全: public interface IHashStorage<T> { public static final float INITIAL_LOAD_FACTOR = 0.7f; public static final int INITIAL_CAPACITY = 149; } 公共抽象类IHashStorage { 私有只读浮点初始负载

我有上面的代码需要翻译成c。唯一合适的解决方案似乎是将其设置为抽象类。从我发现的情况来看,使用readonly比const更安全:

public interface IHashStorage<T> {
    public static final float INITIAL_LOAD_FACTOR = 0.7f;
    public static final int INITIAL_CAPACITY = 149;
}
公共抽象类IHashStorage
{
私有只读浮点初始负载因数=(浮点)0.7;
私有只读int初始容量=149;
}

Java中的项目使用Decorator模式和代理,从Java到c#的转换可能需要使用更多的抽象类(目前Java中只使用接口)?理论上我知道它们之间的区别,但实际上在c语言中我更多地使用抽象类。我对java不太熟悉,我想知道你关于如何找到完成这项任务的最佳解决方案的建议,我指的是转换代码时要记住的要点。

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

  • 将字段设置为接口上的属性(可能是只读的),这将强制所有实现指定它们
  • 将字段设置为接口和/或实现上定义的自定义属性

  • 我将使用get属性定义一个接口。
    然后,让我的基类实现它并设置默认值
    然后,为实现java接口的每个java类扩展基类。
    大致如下:

    public abstract class IHashStorage<T>
        {
            private readonly float INITIAL_LOAD_FACTOR = (float)0.7;
    
            private readonly int INITIAL_CAPACITY = 149;
        }
    
    公共接口存储
    {
    浮点InitialLoadFactor{get;}
    int InitialCapacity{get;}
    }
    公共类HashStorageBase:IHashStorage
    {
    私有只读浮点_initialLoadFactor=0.7f;
    私有只读int_initialCapacity=149;
    公共浮动初始负载因子
    {
    获取{return\u initialLoadFactor;}
    }
    公共交通容量
    {
    获取{return\u initialCapacity;}
    }
    }
    公共类HashStorage1:HashStorageBase
    {
    ...
    }
    
    顺便说一句,将您提到的字段附加到接口似乎是错误的(这就是为什么C#中不允许这样做的原因)。接口不应定义实现,负载系数和初始容量是实现细节。这些应该留给接口的特定实现,而不是接口本身。注意,在分配时不需要强制转换为float。您仍然可以使用0.7f;
    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>
    {
        ...
    }