接口有不同的类型

时间:2013-11-21 15:34:29

标签: c# .net oop interface

我遇到一个问题,我有两个实现要共享一个界面,但是它们对于“相同的参数”会有不同的类型,请参阅一个Guid和一个Int

例如:

public Class1 : IGetObject {
   GetObjectBy(int Id);
}

public Class2 : IGetObject {
   GetObjectBy(Guid Id);
}

在应用程序的另一端,“Id”参数将来自用户输入,即字符串。所以我也有

public GetObjectMethod(){
  string id = dropdown.SelectedItem.Text;
  IGetObject GetObject = Shared.Instance.GetObject;
  var result = GetObject.GetObjectBy(id);
}

如何让实现共享接口,以便我不必在GetObjectMethod中更改某些内容?

我认为可能的想法是创建一个像这样的新类型并在公共界面中声明它。通过这种方式,实施知道它应该使用哪个属性:

public class ObjectId(){
   public ObjectId(string id){
      if(Guid.TryParse(id)){
       /// Figure out what value that should be set
      }
   }

   public Guid ObjectIdAsGuid;
   public Int  ObjectIdAsInt;
}

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

您可以创建接受字符串(或对象)的GetObjectBy方法,然后在接口的实现中解析(或转换)id:

public Class1 : IGetObject {
   public Foo GetObjectBy(string Id) 
   { 
      var id = Int32.Parse(Id); 
      //... 
   }
}

public Class2 : IGetObject {
   public Foo GetObjectBy(string Id) 
   {
       var id = new Guid(Id); 
       //... 
   }
}

答案 1 :(得分:3)

  

我想分享一个界面,但是“相同的参数”

会有不同的类型

这样做的一种方法是使界面通用:

public interface IGetObject<T>
{
   void GetObjectBy(T Id);
}

public class Class1 : IGetObject<int> {
   void GetObjectBy(int Id);
}

public class Class2 : IGetObject<Guid> {
   void GetObjectBy(Guid Id);
}

否则你需要两个重载,但是每个类都必须实现这两个函数:

public interface IGetObject
{
   void GetObjectBy(int Id);
   void GetObjectBy(Guid Id);
}

public class Class1 : IGetObject {
   void GetObjectBy(int Id);
   void GetObjectBy(Guid Id);
}

public class Class2 : IGetObject<Guid> {
   void GetObjectBy(int Id);
   void GetObjectBy(Guid Id);
}

答案 2 :(得分:0)

为您的ID创建一个基类,它将两种ID类型合并为一个通用ID