C# - 继承,覆盖

时间:2011-09-23 07:02:40

标签: c# inheritance types

我可以这样做吗? (过度简化,因为它太复杂了)

abstract class A {
  public string Print() {}

  public static string DoPrint(A a, Type T) {
    ((T)a).Print(); // <-- This should call eg. A3.Print(), not A.Print()
  }
}

class A1: A {
  public new string Print() {}
}

class A2: A {

}

class A3: A {
  public new string Print() {}
}

class Somewhere
{
  A3 a3 = new A3();
  a3.DoPrint();
}

我有许多从基类(A)继承的类(A1,A2,A3等)

我正在尝试在A类中创建上面的DoPrint()函数。 可以吗?

我试过这个

  public static string DoPrint(A a) {
    a.Print();
  }

但它调用A.Print(),而不是A3.Print()

编辑:将标题更改为“将类型作为参数传递?”因为每个人都是对的,我可以使用虚拟(谢谢!)。这个问题在其他地方撒谎,与这个问题无关。

5 个答案:

答案 0 :(得分:3)

public static string DoPrint(A a) {
  a.Print();
}

会起作用,但你需要将Print声明为虚拟并覆盖它。

    abstract class A {
      public virtual string Print() {}

      public static string DoPrint(A a) {
          a.Print();
      }
    }

    class A1: A {
      public override string Print() {}
    }

    class A2: A {
      public override string Print() {}
    }

    class A3: A {
      public override string Print() {}
    }

    class Somewhere
    {
      A3 a3 = new A3();
      A.DoPrint(a3);
    }

答案 1 :(得分:2)

不使用new,而是将基类'Print方法标记为虚拟,然后在子类方法声明中使用override。

public virtual string Print() { }

在子类中:

public override string Print() { }

答案 2 :(得分:1)

基本上没有。你不能。除非你进入反射级别并通过它找到并调用Print上定义的T方法。接口或dynamic之类的任何内容都会选择最顶层的实现。

但是,我想知道这里的Print()virtual

abstract class A {
  public abstract string Print();
}

class A1: A {
  public override string Print() {}
}

class A2: A {
  public override string Print() {}
}

class A3: A {
  public override string Print() {}
}

然后致电a.Print();。然后,多态性将调用最Print()的覆盖。

答案 3 :(得分:1)

普通虚拟方法和继承有什么问题?看看虚拟和覆盖的使用:

abstract class A { 
 public virtual string Print() {} 

  public static string DoPrint(A a) { 
     a.Print(); // <-- This WILL call eg. A3.Print(), not A.Print() 
  } 
} 

class A1 : A
{
    public override string Print() {}
}

class A2 : A
{
    public override string Print() {}
}
class A3 : A
{
    public override string Print() {}
}

答案 4 :(得分:1)

DoPrint()是一个静态函数。

你应该这样称呼它:

A3.DoPrint(a3, typeof(A3));

A3.DoPrint(a3, a3.GetType());

现在,我不明白你为什么要那样做。为什么不在类Print()中简单地使用虚拟A并在派生类中覆盖它?