A和B之间有什么区别吗?
A类有私有构造函数:
class A
{
private A()
{ }
}
Run Code Online (Sandbox Code Playgroud)
B类是密封的,有一个私有构造函数:
sealed class B
{
private B()
{ }
}
Run Code Online (Sandbox Code Playgroud) 如何防止在派生类中重写方法?
在Java中,我可以通过final在我希望防止被覆盖的方法上使用修饰符来实现此目的.
我如何在C#中实现同样的目标?
我知道使用sealed但显然我只能用override关键字吗?
class A
{
public void methodA()
{
// Code.
}
public virtual void methodB()
{
// Code.
}
}
class B : A
{
sealed override public void methodB()
{
// Code.
}
}
Run Code Online (Sandbox Code Playgroud)
所以在上面的例子中,我可以防止methodB()被派生自类的任何类重写B,但是如何防止类首先B覆盖methodB()?
更新:当我发布此问题时,我错过了A类声明中的virtual关键字methodB().纠正了它.
public sealed interface IMyInterface
{
}
Run Code Online (Sandbox Code Playgroud)
给出"修改后的'密封'对此项无效"
我可以在某些方面理解接口必须是可降级的,否则类不能实现它.
但是为什么我不能指定一个接口不应该定义一个子接口,或者有没有办法,只是没有sealed?
编辑
我应该努力解释为什么我会想要这个.我经常看到接口继承链,其中dev应该使用组合.Sealed在课堂上是理想的,我想知道是否有办法对接口强制执行相同的操作.由于不合理的继承性使得我认为更难以重构和维护.
编辑2
在评论和帖子的反映中,接口继承树不能像对象继承树那样复杂.当你从另一个界面派生时,IX你所说的只是"必须实现IX".防止这种情况没有任何好处.
是否总是需要在以下代码的方法的签名中跟随sealed关键字override:
public sealed override string Method1(){.....}
Run Code Online (Sandbox Code Playgroud)
我的意思是,如果我想在没有覆盖的情况下"密封"基类中的方法,override关键字仍然是必要的吗?
运行此代码:
_foo = MockRepository.GenerateStub<IBar>();
_foo.Stub(x => x.Foo()).Return("sdf");
Run Code Online (Sandbox Code Playgroud)
什么时候
public interface IBar
{
string Foo();
}
public class Bar : IBar
{
public string Foo()
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
抛出NotSupportedException - "无法创建密封类的模拟".我明白为什么你不能模拟一个密封的类(虽然在TypeMock中有解决方案),但是模拟一个返回密封类(字符串)的类有什么问题?
创建类时,可以使用TypeDescriptor.GetConverter(typeof(T))将TypeConverter属性应用于它,返回自定义类型转换器.例如:
[TypeConverter(typeof(FooConverter))]
public class Foo
{...}
public class FooConverter: TypeConverter
{...}
var tc = TypeDescriptor.GetConverter(typeof(T)); //returns a FooConverter instance.
Run Code Online (Sandbox Code Playgroud)
只要课程是我们制作的,这就有效.但是如何为我们无法修改源代码的类提供自定义TypeConverter?例如,如何为System.Version类(没有一个)提供自定义TypeConverter?
有人请告诉我以下使用sealed不编译的原因吗?然而,如果我更换sealed与final和编译如Java,它的工作原理.
private sealed int compInt = 100;
public bool check(int someInt)
{
if (someInt > compInt)
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在超类中实现一个方法,该方法应该可以在子类中使用,但不能更改.考虑一下:
export abstract class BaseClass {
universalBehavior(): void {
doStuff(); // Do some universal stuff the same way in all sub classes
specializedBehavior(); // Delegate specialized stuff to sub classes
}
protected abstract specializedBehavior(): void;
}
Run Code Online (Sandbox Code Playgroud)
我的意图是BaseClass的任何子类不仅可以省略实现universalBehavior(),甚至不允许提供实现.这在TypeScript中是不是可能?当我省略子类中的实现时,Intellisense会抱怨.我能做的最好的就是:
export class SubClass extends BaseClass {
universalBehavior(): void {
super.universalBehavior();
}
specializedBehavior(): void {
// sub class' implementation
}
}
Run Code Online (Sandbox Code Playgroud)
显然这是有问题的,因为我必须确保没有子类实现universalBehavior()除了调用之外的任何东西super.universalBehavior().
我刚刚看到一些(大概)C++代码,它运行着我不知道的两个"关键字"(我假设关键字但是,因为我没有上下文,所以它们可能很简单#define).
它们似乎也没有出现在C++ 11标准中,至少是我的草案,但由于这是一个非常晚的草案,我无法想象它们会在最后一分钟被放入标准.他们是ref和sealed.
我发现它们的代码是这样的:
public ref class DevIface sealed {
private:
int currOffset;
public:
DevIface (int initOffset);
: : :
Run Code Online (Sandbox Code Playgroud)
有谁知道这些关键词是什么,以及它们的意图是什么?
sealed ×10
c# ×8
.net ×2
inheritance ×2
c#-4.0 ×1
c++ ×1
constructor ×1
final ×1
interface ×1
java ×1
mocking ×1
overriding ×1
ref ×1
rhino-mocks ×1
stub ×1
typescript ×1