实现后密封接口

时间:2011-03-22 03:29:03

标签: c# interface virtual override sealed

我正在开展一个小项目,但我遇到了这个问题。

项目输出是一个包含接口的库。我希望实现该接口并尽可能密封其中的函数:

public interface ITest
{
    void SomeMethod();
}

class A : ITest
{
    public sealed override SomeMethod()
    {

    }
}

我们的想法是让每个人都可以使用该界面,并拥有一些实现它的专门类。例外情况是,我想确保如果某人创建了类型A的专用类,他/她将无法更改方法的行为。

问题是您不能在其中放置“override”关键字,因为该方法未在界面中声明为“虚拟”。而且你不能在接口中将其声明为“虚拟”,因为它是不允许的。并且您无法删除“override”关键字,因为“密封”需要它。

任何变通方法或头脑风暴的想法都会受到欢迎,但如果有人能想出一个包含界面的解决方案,我真的很乐意学习它!

谢谢!

编辑:忘了这个问题!就像Ani说的那样,我忘了默认C#中的方法是密封的。似乎偶尔回到基础知识总是好的...

5 个答案:

答案 0 :(得分:22)

我可能完全误解了这个问题,但如果您打算在A中密封该方法,那么您可以这样做:

class A : ITest
{
    public void SomeMethod()  { ... }
}

与Java不同,C#中的方法默认密封 A的子类将无法覆盖该方法,因为它尚未标记为virtual

另一方面,如果您打算在界面中标记“几乎密封”的方法,那么强制在实现类上立即将其密封,这是不可能的。它不是(也不应该是)界面的业务来指示实现的这些细节 - 接口意味着代表规范

答案 1 :(得分:3)

使用具有内部可见性的抽象基类。这个基类在库外是不可见的,但允许你密封方法,类仍然实现接口。

public interface ITest
{
    void SomeMethod();
}

internal abstract class SuperA : ITest
{

    public abstract void SomeMethod();

}

class A : SuperA
{
    public sealed override void SomeMethod()
    {

    }
}

答案 2 :(得分:2)

您对sealed关键字的理解不正确。作为方法修饰符,sealed用于防止在下一代派生类中覆盖virtual方法(在基类中定义)。例如:

class Base
{
   public virtual void M() { }
}

class Derived : Base
{
   public sealed override void M() { }
}

class A : Derived
{
   public override void M() { } //compile error, M is sealed in Derived
}

开发人员总是可以使用new修饰符来定义派生类中具有相同名称的方法,该方法隐藏了基类中定义的方法。

  

如果有人创建了专门的类   A型,他/她将无法做到   改变方法的行为。

如果“专门类”是指从A派生的类,答案是:他总是可以隐藏A中的方法,但是他不能改变方法的行为。

答案 3 :(得分:1)

为什么不使用如下的抽象类。

没有测试过,但这应该有用吗?

public abstract class Test
{
    public virtual void SomeMethod() {}
    //OR
    public abstract void SomeMethod();//MSDN says:
    //an abstract method is implicitly virtual
}

class A : Test
{
    public sealed override SomeMethod()
    {

    }
}

答案 4 :(得分:0)

默认情况下,C#中的方法是密封的。这是一个示例

class Program
{
    static void Main(string[] args)
    {

        A obj = new A();
        obj.SomeMethod();
        b ss = new b();
        ss.SomeMethod();
        Console.ReadLine();
    }
}

public interface ITest { void SomeMethod(); }

class A : ITest { public void SomeMethod() {

    Console.WriteLine("SomeMethod Called from Class A object");
} }

class b : A
{
    //public override void SomeMethod()
    //{
    //    Console.WriteLine("Called from Class B Object");
    //}
}