Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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# 使用与类成员一起密封的运算符_C# - Fatal编程技术网

C# 使用与类成员一起密封的运算符

C# 使用与类成员一起密封的运算符,c#,C#,我在Troelsen的书中发现,操作符sealed可以用于类的成员,以保护virtual方法不受覆盖的影响 但是,如果我不想覆盖一个虚拟的方法,那么将其设置为虚拟的又有什么意义呢?您可能会遇到这样的情况: public class A { public virtual void MyMethod() { //... } } public class B : A { public override void MyMethod() {

我在Troelsen的书中发现,操作符sealed可以用于类的成员,以保护virtual方法不受覆盖的影响


但是,如果我不想覆盖一个虚拟的方法,那么将其设置为虚拟的又有什么意义呢?

您可能会遇到这样的情况:

public class A
{
    public virtual void MyMethod()
    {
        //...
    }
}


public class B : A
{
    public override void MyMethod()
    {
        //...
    }
}


public class C : B
{
    public override void MyMethod()
    {
        //...
    }
}
但是,如果您希望继承类
C
不能重写
B
MyMethod
,而仍然允许
B
重写
A
,该怎么办?然后你可以做:

public class B : A
{
    public sealed override void MyMethod()
    {
        //...
    }
}

使用此更改,您不能再重写<代码> c>代码> >

在此上下文中,请考虑以下示例:

public class A
{
    public virtual void SomeMethod() { }
}

public class B : A
{
    public sealed override void SomeMethod() { }
}

public class C : B
{
    public override void SomeMethod() { }
}

在本例中,如果不在
类B
中的
SomeMethod
上使用
sealed
关键字,
类C
将能够覆盖它,因为它的原始声明是
virtual
。此上下文中的
sealed
关键字生成编译器错误。请参阅。

我不太明白。类B和C有自己的方法副本。所以,若C将继承B(不使用sealed),那个么B中的方法并没有改变,因为它有自己的副本。“还是不?”迪玛,恐怕我不明白你的问题。
B
中的方法覆盖
A
中的方法,而
C
中的方法(未密封)覆盖
A
B
中的方法。这就是你要问的吗?是的,谢谢。我没有注意到C继承了B,我想,它继承了A,现在一切都清楚了。