【问题标题】:Interface with different types不同类型的接口
【发布时间】:2013-12-06 04:05:24
【问题描述】:

我有一个问题,我有两个实现我想共享一个接口,但是它们对于“相同的参数”会有不同的类型,请参阅一个 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 中的某些内容?

我认为可能的想法是创建一个像这样的新 type 并在公共界面中声明它。这样,实现就知道它应该使用哪个属性:

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;
}

最好的方法是什么?

【问题讨论】:

  • 你的接口定义是什么?我猜它应该有 2 个 GetObjectBy 的重载
  • 那么两者都必须实现。
  • 问题是我不知道如何声明接口。即使我有一个重载,GetObjecetMethod 也需要确定它在“id”参数上的类型。

标签: c# .net oop interface


【解决方案1】:

您可以创建接受字符串(或对象)的 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); 
       //... 
   }
}

【讨论】:

    【解决方案2】:

    我想共享一个接口,但是“同一个参数”会有不同的类型

    一种方法是使接口通用:

    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);
    }
    

    【讨论】:

    • 也许你应该包括一个使用Convert.ChangeType 的例子,让他像他需要的那样使用string 输入。我认为这是我的首选解决方案。
    • @TimS。 Convert.ChangeType 是什么意思?
    • 类似GetObjectBy((T)Convert.ChangeType(id, typeof(T)))。但实际上,我不太确定这是否可行,因为您可能没有可用的T。也许stringobject 参数是做到这一点的唯一好方法......
    【解决方案3】:

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

    【讨论】:

    • @SimonEdström:我认为这基本上是您的最后一个建议,ObjectID 类,我认为这是一个好主意。您已经了解了 ID 的概念,它应该被视为一个类,可以根据需要转换为整数、Guid 或其他任何东西。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    相关资源
    最近更新 更多