【问题标题】:Method can take two objects of different class [duplicate]方法可以采用不同类的两个对象[重复]
【发布时间】:2016-07-14 13:20:38
【问题描述】:

我有两个对象,它们位于两个不同的类中,但具有相同的属性。我想在其中一个对象中做一个参数的函数,并用我想要的对象(一个或另一个)调用这个方法

这个方法可以达到一个或另一个的属性

【问题讨论】:

  • 接口?做不到这一点,dynamic?
  • 它们都应该实现一个通用接口
  • 正确答案是语义和设计问题,而不是重复代码删除问题。没有上下文,您只会得到一些可能聪明但不正确的解决方法,例如定义不明确的接口或动态的或将一个映射到另一个......

标签: c# function object methods


【解决方案1】:

听起来你应该重构类,因为具有相同属性的两个类听起来像是代码重复。

但如果您需要这样做(不知道您的问题),您可以使用接口。因此,如果我们有两个存储名称的类,它们可以实现如下接口:

所以接口定义了实现它的类会做什么——就像一个契约。

 interface INameable
 {
     public string Name { get; set; }
 }

然后让你的类实现接口:

class Pet : INameable
 {
    public string Name { get; set; }
 }


 class Person : INameable
 {
    public string Name { get; set; }
 }

终于有了一个接受接口类型对象的方法:

public void MyMethod(INameable nameableObject)
{
     // do stuff
}

现在您可以将任何实现 INameable 的对象传递给 MyMethod 调用 - 在本例中为 Pet 或 Person。

【讨论】:

    【解决方案2】:

    方法可以取两个不同类的对象吗?

    我是这样解释的:

    我需要一种方法,可以采用看起来相同的对象,而不管实现如何

    就像我在评论中提到的那样,您应该使用interface——考虑以下几点:

    public interface ICommonObject
    {
        int Id { get; }
        string Name { get; }        
    }
    
    public class ObjectOne : ICommonObject
    {
        int Id { get; }
        string Name { get; }
    
        public ObjectOne(int id, string name) 
        {
            Id = id;
            Name = name;
        }
    }
    
    public class ObjectTwo : ICommonObject
    {
        int Id { get; }
        string Name { get; }
    
        public ObjectTwo(int id, string name) 
        {
            Id = id;
            Name = name;
        }
    }
    

    然后在您的方法中,您将ICommonObject 接口作为参数——这样任何一个实现都可以作为参数传递给它。像这样:

    public class CommonLogic
    {
        public void ActOnCommonObject(ICommonObject commonObject)
        {
            // TODO: do somthing with "commonObject"
        }
    }
    

    现在您可以拥有任一公共对象的实例,只要它实现了该接口,它就可以作为参数有效。下面的代码就可以了:

    {
        var logic = new CommonLogic();
    
        var one = new ObjectOne();
        var two = new ObjectTwo();
    
        logic.ActOnCommonObject(one);
        logic.ActOnCommonObject(two);
    }
    

    您留下了一个封装的逻辑 sn-p,它可以与特定实现无关,可以轻松进行单元测试。


    有关interface 实现check out this MSDN article 的更多详细信息。

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2023-04-07
      • 2012-09-07
      • 2012-08-07
      相关资源
      最近更新 更多