相关疑难解决方法(0)

有没有办法调用重写方法的父版本?(C#.NET)

在下面的代码中,我尝试了两种方法来访问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

那个答案被删除了.我想知道这个黑客是否可行,只是为了好奇.

.net c# inheritance

37
推荐指数
3
解决办法
4万
查看次数

如何序列化指向被覆盖的虚拟方法的基础的委托?

虽然其他 问题有关使用反射来绕过所有安全装置,直接调用基类的实现的覆盖方法一般都遭到了嘲笑,并呼吁重新设计有问题的代码,我想我已经在一个奇异的,但合法的使用情况下跌跌撞撞:委托序列化.由于我已经看到了其他问题,不要用重新设计我的代码并停止尝试绕过类型系统的建议来轰炸我 - 我正在编写一个序列化格式化程序,而那些已经得到了忽略构造函数的传递.

令我沮丧的是,即使是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)

.net reflection serialization delegates compact-framework

5
推荐指数
0
解决办法
222
查看次数

如何实现基类的虚方法,并在c#中的覆盖方法中获取基方法实现

我有一个抽象类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)

c#

3
推荐指数
1
解决办法
795
查看次数

如何让基类调用它的虚函数?

例如在下面的程序我想entrypoint()A能够打电话 doThisA,但它调用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)

编辑:如何调用重写的虚拟方法的“基本实现”?是相似的,但我是从基类而不是主类调用基实现。

编辑:类似于即使当前实例是派生类,我们如何从基类中的另一个方法调用虚拟方法?

c#

1
推荐指数
1
解决办法
76
查看次数

如何从子类中的方法调用子类中覆盖的父方法?

我想调用 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# oop methods method-call

1
推荐指数
1
解决办法
57
查看次数

在一般编程中,有没有办法“附加到函数”而不仅仅是覆盖整个事物?

我目前正在使用 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# inheritance keyword

0
推荐指数
1
解决办法
151
查看次数