如何访问C#中的第一个基类?

如何访问C#中的第一个基类?,c#,.net,C#,.net,我的应用程序中定义了一个基类 大概 using System; public class BaseClass { public virtual void Method2() {Console.WriteLine("base2");} public virtual void Method1() {Console.WriteLine("base1");} } public class Derived1 : BaseClass { p

我的应用程序中定义了一个基类

大概

using System;

public class BaseClass
    {
       public virtual void Method2() {Console.WriteLine("base2");}
       public virtual void Method1() {Console.WriteLine("base1");}
    }
public class Derived1 : BaseClass
    {
       public override void Method2() {Console.WriteLine("derived1-2");}
       public override void Method1() {Console.WriteLine("derived1-1");}
    }
    public class Derived2 : Derived1
    {
       public override void Method1() {Console.WriteLine("derived2-2");}


    }
public class Program
{
    public static void Main()
    {
        var obj = new Derived2();
        ((BaseClass)obj).Method2();
        Console.WriteLine("Hello World");
    }
}
假设我需要访问我的第一个基类的
Method2()。即使在将其键入
((基类)obj.Method2()
)之后,我仍然得到了
derived1-2
,而我期望
base2'


如何做到这一点?

我完全同意这些评论:听起来你需要的行为需要你重新思考你的类——在这种情况下,继承可能不是最好的解决方案。这取决于你想做什么;很明显,你可以这样做:

var obj = new BaseClass();
((BaseClass)obj).Method2();
Console.WriteLine("Hello World");
我猜你实际上想要的是某种形式的注射;例如:

public class BaseClass
{
    private readonly IFunctionality1 functionality1;

    public virtual void Method2() { Console.WriteLine("base2"); }
    public virtual void Method1() { this.functionality1.Method1(); }

    public BaseClass(IFunctionality1 functionality1)
    {
        this.functionality1 = functionality1;
    }
}
public class Derived1 : BaseClass
{
    public Derived1(IFunctionality1 functionality1) : base (functionality1)
    {

    }

}

在这种情况下,您可能会发现继承不再是必需的。

BaseClass
的设计(显然)是为了将对
Method2
的调用解析为覆盖该方法的最特定类型。如果不希望发生这种情况,则需要重新设计基类或层次结构。它可以在
IL
call
vs
callvirt
)中完成,但不能用C语言表达,你不能。这就是
virtual
的全部内容。如果希望该方法保持对派生类的可访问性,请提供(
protected
)虚拟方法调用的非虚拟实现。如果希望方法由变量的类型而不是实际对象的类型确定,则不要使用
virtual
,然后使用
new
而不是
override
。作为本对话的旁注,拥有覆盖继承功能的类是有风险的。您应该调用继承类的方法,然后调用重写中的额外代码。例如,基类可能有一些验证代码来防止错误调用,如果完全重写该方法,则将跳过该检查。也许我读得太多了,鲍勃·马丁:(附言,也许你的基类在创建时应该考虑到“开放扩展”^^