[英]How would such a java code look in C#?
我正在將一個java代碼移植到C#並遇到了這段代碼。 我無法想象如何移植它,因為它似乎聲明了類數組。 我在C#中的知識太有限,無法弄清楚如何在C#中實現此操作。 在C#中是否存在與此Stub聲明等效的內容,它看起來如何? 我把它縮小到最小,因為它宣布了10個物體。 以下是代碼的外觀:
public interface IcodecWeightFunctionStub
{
void hcodec_weight_func(int[] block, int block_offset, int stride, int log2_denom, int weight, int offset);
}
public interface IHcodecBiWeightFunctionStub
{
void hcodec_biweight_func(int[] dst, int dst_offset, int[] src, int src_offset, int stride, int log2_denom, int weightd, int weights, int offset);
}
public IHcodecWeightFunctionStub[] weight_hcodec_pixels_tab = new IHcodecWeightFunctionStub[] {
new IHcodecWeightFunctionStub() {
public void hcodec_weight_func(int []block, int block_offset, int stride, int log2_denom, int weight, int offset) {
weight_hcodec_pixels_c(16, 16, block, block_offset, stride, log2_denom, weight, offset);
}
},
new IHcodecWeightFunctionStub() {
public void hcodec_weight_func(int []block, int block_offset, int stride, int log2_denom, int weight, int offset) {
weight_hcodec_pixels_c(16, 8, block, block_offset, stride, log2_denom, weight, offset);
}
}
};
問題不在於在C#中實例化接口,而在於在C#中返回新類。
匿名委托實現和C#的lambda是最接近Java的匿名接口實現的東西,但接口需要有一個方法。 您的接口都有一個方法,因此您的代碼可以轉換為C#,如下所示:
public delegate void HcodecWeightDelegate(int[] block, int block_offset, int stride, int log2_denom, int weight, int offset);
public delegate void HcodecBiweightDelegate(int[] dst, int dst_offset, int[] src, int src_offset, int stride, int log2_denom, int weightd, int weights, int offset);
public HcodecBiweightDelegate[] WeightHcodecPixelsTab = new HcodecBiweightDelegate[] {
(block, block_offset, stride, log2_denom, weight, offset) => {
weight_hcodec_pixels_c(16, 16, block, block_offset, stride, log2_denom, weight, offset);
}
, (block, block_offset, stride, log2_denom, weight, offset) => {
weight_hcodec_pixels_c(16, 8, block, block_offset, stride, log2_denom, weight, offset);
}
};
請注意,調用委托也是不同的:在Java中,您可以像這樣調用它們:
weight_hcodec_pixels_tab[i].hcodec_weight_func(block, block_offset, stride, log2_denom, weight, offset);
在C#中,您沒有方法名稱(因為委托封裝了單個方法),因此相同的調用將如下所示:
HcodecBiweightDelegate[i](block, block_offset, stride, log2_denom, weight, offset);
你的例子有點不一致 - 接口方法名稱不匹配,但希望我的數組示例和C#等價物將有所幫助。 你可以使用delegates和lambdas,但是沒有必要這樣做。 對於以下Java代碼:
public interface Foo
{
void Bar(int i);
}
class test
{
//array of anonymous inner classes:
public Foo[] x = new Foo[] {
new Foo() {
public void Bar(int i) {
//code 1
}
},
new Foo() {
public void Bar(int i) {
//code 2
}
}
};
}
以下C#代碼是等效的:
public interface Foo
{
void Bar(int i);
}
class Test
{
public Foo[] x = new Foo[] { new FooAnonymousInnerClassHelper1(), new FooAnonymousInnerClassHelper2() };
private class FooAnonymousInnerClassHelper1 : Foo
{
public virtual void Bar(int i)
{
//code 1
}
}
private class FooAnonymousInnerClassHelper2 : Foo
{
public virtual void Bar(int i)
{
//code 2
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.