【问题标题】:C# method overloading without rewriting content无需重写内容的 C# 方法重载
【发布时间】:2019-12-17 22:20:42
【问题描述】:

我有多个类,但它们都有一个具有相同类型和名称的变量。然后,我有一个方法,它获取我之前提到的变量的值,并以相同的方式处理它,无论输入类型是什么。

这里是例子:

class A{ int i; }
class B{ int i; }
class C{ int i; }

这就是我目前如何编写处理每个类的 int i 值的方法

int foo(A input) { return input.i*2; }
int foo(B input) { return input.i*2; }
int foo(C input) { return input.i*2; }

只是针对不同的输入类型写了很多,那么如何在不重写方法内容的情况下进行方法重载呢?

我正在寻找的图像:

int foo(A input),foo(B input),foo(C input) { return input.i*2; }

【问题讨论】:

  • 您可以定义一个通用的interface 并将其用作方法的参数类型:public interface IHaveNumber { int i { get; set; } } public int Foo(IHaveNumber input){ ... }
  • @germi 我认为使用 c#8 你甚至可以在接口中使用默认实现。这样做的缺点是它违背了界面应该是什么。
  • @EpicKip 是的,但我不希望初学者指向这一点,因为它已经足够令人困惑了(即使对于有更多经验的人来说)。
  • @germi 完全同意。我知道存在但拒绝使用它,因为它在其他人阅读我的代码时增加了不可预测性。 IMO 接口应该仅是一个合同,而不是一个实现。如果需要,我建议人们使用基类。

标签: c# methods


【解决方案1】:

最简单和最惯用的方法是像这样定义interface:

public interface IHaveNumber //or whatever you want to call it
{
    int i { get; set; } // I would propose a better name for this...
}

public int Foo(IHaveNumber input)
{
    //whatever ...
}

public class A : IHaveNumber
{
    public int i { get; set; }
}

另一种可能性是(例如)B 和 C 派生自 A 并将 Foo 定义为采用基类:

public class A { public int i { get; set; } }
public class B : A { }
public class C : A { }

public int Foo(A input){ ... }

一般来说,我认为查看有关 polymorphism 和 inheritance 的文档会有所帮助。

【讨论】:

    【解决方案2】:

    像这样创建一个抽象类怎么样:

    public abstract class Calculate
    {
        public abstract int input { get; set; }
        public virtual int  foo() { return input * 2; }
    }
    

    其他类如下:

    class A: Calculate {       
        public override int input { get ; set ; }
    }
    class B : Calculate
    {
        public override int input { get; set; }
    }
    class C : Calculate
    {
        public override int input { get; set; }
    }
    

    现在你不需要传递任何东西来完成同样的工作,只需像下面这样调用方法:

    A aInstance = new A() { input = 10 };
    aInstance.foo();
    

    您也可以查看example 以获取使用参考

    【讨论】:

    • 感谢您的帮助!虽然我还不知道代码的某些部分,因为我是 c# 的初学者,但是通过仔细查看代码,我了解代码的作用。谢谢你:)
    【解决方案3】:

    使用 foo() 方法创建一个父类,然后创建从该父类继承的 A、B、C 类..

    【讨论】:

      【解决方案4】:

      您可以使用其他类将继承的基类

      例如:

      Base.cs

      public abstract class Base
      {
         int i {get;set;}
      }
      

      ClassA.cs

      public class ClassA: Base
      {
        //Put your class specific variables in here
        string name {get;set;}
      }
      

      ClassB.cs

      public class ClassB: Base
      {
        //Put your class specific variables in here
        int age{get;set;}
      }
      

      方法 然后在编写方法时可以将参数设置为基类

      public int Calculate(Base base)
      {
         return base.i * 2;
      }
      

      【讨论】:

      • 好的,谢谢你的帮助 :)) 我有时会根据情况使用这个
      • 没问题,我想这在方法不是它自己的类的一部分的情况下可能会有所帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      相关资源
      最近更新 更多