在下面的代码中,我尝试了两种方法来访问methodTwo的父版本,但结果总是2.有没有办法从ChildClass实例获得1结果而不修改这两个类?
class ParentClass
{
public int methodOne()
{
return methodTwo();
}
virtual public int methodTwo()
{
return 1;
}
}
class ChildClass : ParentClass
{
override public int methodTwo()
{
return 2;
}
}
class Program
{
static void Main(string[] args)
{
var a = new ChildClass();
Console.WriteLine("a.methodOne(): " + a.methodOne());
Console.WriteLine("a.methodTwo(): " + a.methodTwo());
Console.WriteLine("((ParentClass)a).methodTwo(): "
+ ((ParentClass)a).methodTwo());
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
更新 ChrisW发布了这个:
从课外,我不知道任何简单的方法; 但是,也许,我不知道如果尝试反射会发生什么:使用Type.GetMethod方法查找与ParentClass中的方法关联的MethodInfo,然后调用MethodInfo.Invoke
那个答案被删除了.我想知道这个黑客是否可行,只是为了好奇.
虽然其他 问题有关使用反射来绕过所有安全装置,直接调用基类的实现的覆盖方法一般都遭到了嘲笑,并呼吁重新设计有问题的代码,我想我已经在一个奇异的,但合法的使用情况下跌跌撞撞:委托序列化.由于我已经看到了其他问题,请不要用重新设计我的代码并停止尝试绕过类型系统的建议来轰炸我 - 我正在编写一个序列化格式化程序,而那些已经得到了忽略构造函数的传递.
令我沮丧的是,即使是v2.0 BCL也BinaryFormatter未能通过这个简单的NUnit测试:
[TestFixture]
public class DelegateSerializationTestFixture
{
[Test]
public void DelegateSerializationTest()
{
var bigKitty = new Lion();
var kittyNoise = bigKitty.GetKittyNoiseFunc();
Assert.AreEqual("Meow", kittyNoise());
var stream = new MemoryStream();
var formatter = new BinaryFormatter();
formatter.Serialize(stream, kittyNoise);
stream.Position = 0;
formatter = new BinaryFormatter();
var kittyNoise2 = (Func<string>)formatter.Deserialize(stream);
Assert.AreEqual("Meow", kittyNoise2()); // returns Grrr
}
}
[Serializable]
public class Lion : Cat
{
public override string GetNoise() …Run Code Online (Sandbox Code Playgroud) 我有一个抽象类A,它有部分实现的虚方法,它在类B中继承.我想在派生类中实现虚方法,我应该如何在派生类中获得基本实现.例如.
public abstract class A
{
public int Sum { set; get; }
public virtual void add(int a, int b)
{
Sum = a + b;
}
}
class B : A
{
public override void add(int a, int b)
{
// what should i write here
}
}
Run Code Online (Sandbox Code Playgroud) 例如在下面的程序我想entrypoint()在A能够打电话 doThis的A,但它调用doThisB中,因为这是实例类型。我怎样才能达到我想要的?
void Main()
{
A a = new B();
a.entrypoint();
}
public class A
{
public void entrypoint()
{
this.doThis(); //doesn't call A::doThis()
}
public virtual void doThis()
{
Console.WriteLine ("From A");
}
}
public class B : A
{
public override void doThis()
{
Console.WriteLine ("From B");
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:如何调用重写的虚拟方法的“基本实现”?是相似的,但我是从基类而不是主类调用基实现。
我想调用 FamilyCar 方法 Move()。如果 FamilyCar 是 LandVehicle,我想同时调用 LandVehicle Move() 方法。我正在寻找非常基本的方法来做到这一点。
基类
class LandVehicle : Vehicle
{
public override string Move()
{
return "Move on the wheels";
}
}
Run Code Online (Sandbox Code Playgroud)
子类
class FamilyCar : LandVehicle
{
public override string Move()
{
return "Pip pip!";
}
}
Run Code Online (Sandbox Code Playgroud) 我目前正在使用 C#,我正在使用一个可以使用的库,public override void但这显然覆盖了整个方法。
是否有“附加到方法”的关键字?例如
class A
{
public virtual void HelloWorld()
{
Console.WriteLine("Do this first");
Console.ReadLine();
}
}
class B : A
{
public append void HelloWorld() // <-- Special "append" keyword?
{
Console.WriteLine("Then do this!");
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
所以输出class B : A, HelloWorld()将是
Do this first
Then do this!
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×2
inheritance ×2
delegates ×1
keyword ×1
method-call ×1
methods ×1
oop ×1
reflection ×1