繁体   English   中英

C#-通过参数传递继承的类

[英]C# - Passing a inherited class through a parameter

我有一种情况,我希望能够通过方法参数传递类,并从传递的类的实例中获取类的特定信息。

例:

public abstract class Foo {
   public int x;
}

然后

public class Bar : Foo {
    public int y;
    public Bar(int y) {
        this.y = y;
    }
}

我需要做的是这样的事情

public void foobar(Foo f) {
    int y = f.y;
}

可以这样称呼:

foobar(new Bar(5));

这将获得特定于“ Bar”类的值,该类是从Foo类“继承”的。

我需要能够做到这一点而无需打版,以便可以动态处理该类。

我知道我只能说

((Bar)f).y

但是,关键是我将要传递多个类,并且静态类型转换会破坏目的。

您不应该违反OOP规则。 因此,这是解决方案之一:

public interface IBar
{
    int Y { get; }
}

public Bar : Foo, IBar { ... }

public void foobar(IBar f) {
    int y = f.Y;
}

但是,如果您确实愿意,可以:

使用动态:

public void foobar(Foo f) 
{
    dynamic df = (dynamic)f;
    int y;
    try
    {
       y = df.y;
    }
    catch (RuntimeBinderException)
    {
       // case when foo doesn't have a y
    }
}

或反思:

public void foobar(Foo f) 
{
    var type = f.GetType();
    var field = type.GetFields(BindigFlags.Instance 
                                | BindigFlags.Public)
                      .FirstOrDefault(info => info.Name == "y");

    if (field == null)
    {
       // case when f doesn't have a field
    }

    int y = (int)field.GetValue(f);
}

可以通过鸭子输入来完成,请参考此链接: 鸭子输入

这可以使用动态关键字在C#中完成。

您试图做的设计是不可能的。 我想到的一种方法-在Foo定义抽象方法,所有继承的类都将覆盖此方法。 此方法将返回y (或其他派生类的其他信息)。

public abstract class Foo {
   public int x;
   public abstract int GetValue();
}

public class Bar : Foo 
{
  private int y;
  public Bar(int y) 
  {
    this.y = y;
  }
  public override int GetValue()
  {
     return y;
  }
}

然后您可以像这样检索值

public void foobar(Foo f) {
    int y = f.GetValue();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM