Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问抽象类方法C#,ASP.net_C#_Asp.net_Overriding_Abstract Class_Abstract - Fatal编程技术网

访问抽象类方法C#,ASP.net

访问抽象类方法C#,ASP.net,c#,asp.net,overriding,abstract-class,abstract,C#,Asp.net,Overriding,Abstract Class,Abstract,我的程序中有以下类,现在我想访问类Y中存在的方法M2()。我试图通过创建类Z的对象,然后使用类X的变量强制转换它并调用X.M2(10,5),来访问它。但是,它仍然调用类X中存在的方法M2(),而不是类Y。谢谢 public partial class Abstract_Class : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Z z = new Z();

我的程序中有以下类,现在我想访问类Y中存在的方法M2()。我试图通过创建类Z的对象,然后使用类X的变量强制转换它并调用X.M2(10,5),来访问它。但是,它仍然调用类X中存在的方法M2(),而不是类Y。谢谢

public partial class Abstract_Class : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Z z = new Z();
        int r1 = z.M2(10, 20); //gives output -20
        X x = z;
        int r2 = x.M2(10,5); //gives output 10 while I want it to print 15
    }
}
public class W
{
    public virtual int M2(int x, int y)
    {
        return x - y;
    }
}
public abstract class X : W
{
    public abstract void M1();
    public override int M2(int x, int y)
    {
        return 2*(x-y);
    }
}
public abstract class Y : X
{
    public sealed override int M2(int x, int y)
    {
        return 3 * (x - y);
    }
}
public class Z : X
{
    public override void M1()
    {
    }
}

您需要创建
Y
的实例。因为它是
抽象的
,所以必须创建它的一些子类

public class SubY : Y
{

}
然后在代码中编写如下内容:

var suby = new SubY();
int r2 = suby.M2(10, 5); //15

@RobertMcKee感谢您的评论。我尝试了这个方法,但它抛出了InvalidCastException,说“无法将类型为“Z”的对象强制转换为类型为“Y”。
Z
不是
Y
Z
X
而不是
Y
。我也看不出您在哪里试图将其转换为
Y
。另外,我没有看到在
Z
上定义的
static
M3
方法,但是您在
页面加载
方法的第三行调用它。这里发布的代码是您正在运行的实际代码吗?我看到了您更新的代码,但是
Y
仍然不属于这个等式的任何部分。你是想让你的
Z
继承自
Y
?也就是说有
公共类Z:Y
?编辑:即使如此,您也没有真正隐藏或更改方法。简单地将
z
分配给
X
不会有太大变化;它仍将执行虚拟覆盖解析,并在
M2
@ChrisSinclair上调用最高级别的
override
。@ChrisSinclair对不起,静态方法M3(),实际上我已经从类X中删除了它,但忘了在主类中删除它,我已经编辑了它。那么,是否可以使用这段代码访问类Y中的方法?您需要创建
Y
的实例。因为它是
抽象的
,所以必须创建它的一些子类。说
公共类SubY:Y{}
。然后在代码中编写类似于
var suby=new suby();平方米(10,5)