2011-02-11 78 views
2

这里是问题所在。接口属性名称因类而异

public abstract class A {} 
public class B:A 
{ 
    public TypeF FieldB; 
} 
public class C:A 
{ 
    public TypeG FieldC; 
} 
public class TypeF:A { } 
public class TypeG:A { } 

我想有界面前:ITypeFG并实现它在B和C 有属性的名称会FieldB和FieldC

interface ITypeFG 
{ 
    public A FieldFG; //But i want to have names TypeF in A and TypeG in B 
} 

可以这样做? 谢谢。

回答

5

显式接口实现:

public class B : A, ITypeFG 
{ 
    public TypeF FieldB { get; set; } // please don't expose public fields... 
    A ITypeFG.FieldFG { get { return FieldB; } } 
} 
public class C : A, ITypeFG 
{ 
    public TypeG FieldC { get; set; } 
    A ITypeFG.FieldFG { get { return FieldC; } } 
} 

注意的是,如果接口有一个二传手,你需要投:

public class B : A, ITypeFG 
{ 
    public TypeF FieldB { get; set; } 
    A ITypeFG.FieldFG { get { return FieldB; } set { FieldB = (TypeF)value; } } 
} 
public class C : A, ITypeFG 
{ 
    public TypeG FieldC { get; set; } 
    A ITypeFG.FieldFG { get { return FieldC; } set { FieldC = (TypeG)value; } } 
} 
+0

谢谢!就是这个 :) – 2011-02-11 14:13:24

3

两点:在C#

  1. 接口不能有字段,但他们可以有属性。
  2. 所需功能不明智:如果客户端总是需要知道已实现的接口属性的“特定”名称以与实现进行交互,那么它就不是什么接口 - 它只是一点点比标记。

正如Marc Gravell所说,体面的解决方法是使用显式实现。如果客户端对实现对象的引用类型为接口,则它们可以使用属性的“常规”名称。如果他们有特定的参考(即键入为类型实现类型),他们可以使用“特定”名称(并不会被通用名称混淆,因为他们不会在IntelliSense上看到它)。

0

听起来像是你应该与A一起把字段名的数据,你可以保持一个通用的接口,并通过这种方式唯一的变化是返回什么内容:

class Data 
{ 
    public string Name {get;set;} 
    public A Value {get;set;} 

} 

interface ITypeFG 
{ 
    Data Field {get;} 
} 

class B : A, ITypeFG 
{ 
    public Data Field 
    { 
     get 
     { 
      return new Data {Name = "TypeF", Value = FieldB}; 
     } 
    } 
} 


class C : A, ITypeFG 
{ 
    public Data Field 
    { 
     get 
     { 
      return new Data {Name = "TypeG", Value = FieldC}; 
     } 
    } 
}