实现后密封接口

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

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

public interface ITest { void SomeMethod(); } class A : ITest { public sealed override SomeMethod() { } } 

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

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

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

谢谢!

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

我可能完全误解了这个问题,但如果你的意图是在A密封方法,你可以这样做:

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

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

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

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

 public interface ITest { void SomeMethod(); } internal abstract class SuperA : ITest { public abstract void SomeMethod(); } class A : SuperA { public sealed override void SomeMethod() { } } 

您对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中的方法,但是他不能改变方法的行为。

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

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

 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() { } } 

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"); //} }