4

我有这个:

public class Base {
   public virtual void Connect()
   {
      // do stuff
   }
}

public class Derived1 : Base {
   public override void Connect()
   {
       base.Connect();
      // do other stuff
   }
}

public class Derived2 : Derived {
   public override void Connect()
   {
      base.Connect() // Here I want to call Base::Connect(), not Derived::Connect()
   }
}

有没有办法可以从 Derived2 调用 Base::Connect,因为我想跳过 Derived1::Connect() 中的“做其他事情”部分?

编辑:我必须从 Derived1 派生。

4

2 回答 2

3

你可以尝试将 Connect 拆分为两个函数,并DoConnect在需要的地方从所有派生类调用:

public class Base {
   public virtual void Connect()
   {
      DoConnect();
   }

   protected void DoConnect()
   {
      // do stuff
   }
}

...

public class Derived2 : Derived1 {
   public override void Connect()
   {
      DoConnect();
      ...
   }
}

如果你不能更新基类,你可以在Derived1

public class Derived1 : Base {
   public virtual void Connect()
   {
      DoConnect();
   }

   protected void DoConnect()
   {
      base.Connect();
   }
}
于 2013-06-19T16:30:23.867 回答
1

C# 不提供直接调用base.base.method()您需要首先更改设计的方法。
请检查这个答案为什么-c-sharp-doesnt-support-base-base

所以你需要稍微改变你的设计来制作小技巧或解决方法。

  1. 在你的类中定义一个新方法Derived1,它唯一的工作就是调用base.Connect()
  2. 然后在你的类中Derived2()定义你的Connect()那将简单地调用上一步中定义的前一个函数。

检查这个例子:

public class Base {
    public virtual void Connect() {
        // do stuff
    }
}

public class Derived1: Base {
    public override void Connect() {
        base.Connect();
        // do other stuff
    }
    public void CallBaseConnnect() {
        //here make only one call to base.Connect(). 
        //that's how class Derived1 'll provide you away to call base.Connect().
        base.Connect();
    }
}

public class Derived2: Derived {
    public override void Connect() {
        //here just make a call to CallBaseConnnect() in base class Derived1
        //that 'll equivalent to base.base.Connect.
        base.CallBaseConnnect();
    }
}
于 2013-06-19T16:40:05.290 回答