我正在开展一个小项目,但我遇到了这个问题。
项目输出是一个包含接口的库。我希望实现该接口并尽可能密封其中的函数:
public interface ITest
{
void SomeMethod();
}
class A : ITest
{
public sealed override SomeMethod()
{
}
}
我们的想法是让每个人都可以使用该界面,并拥有一些实现它的专门类。例外情况是,我想确保如果某人创建了类型A的专用类,他/她将无法更改方法的行为。
问题是您不能在其中放置“override”关键字,因为该方法未在界面中声明为“虚拟”。而且你不能在接口中将其声明为“虚拟”,因为它是不允许的。并且您无法删除“override”关键字,因为“密封”需要它。
任何变通方法或头脑风暴的想法都会受到欢迎,但如果有人能想出一个包含界面的解决方案,我真的很乐意学习它!
谢谢!
编辑:忘了这个问题!就像Ani说的那样,我忘了默认C#中的方法是密封的。似乎偶尔回到基础知识总是好的...答案 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");
//}
}