如何访问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
vscallvirt
)中完成,但不能用C语言表达,你不能。这就是virtual
的全部内容。如果希望该方法保持对派生类的可访问性,请提供(protected
)虚拟方法调用的非虚拟实现。如果希望方法由变量的类型而不是实际对象的类型确定,则不要使用virtual
,然后使用new
而不是override
。作为本对话的旁注,拥有覆盖继承功能的类是有风险的。您应该调用继承类的方法,然后调用重写中的额外代码。例如,基类可能有一些验证代码来防止错误调用,如果完全重写该方法,则将跳过该检查。也许我读得太多了,鲍勃·马丁:(附言,也许你的基类在创建时应该考虑到“开放扩展”^^