class ClassSealer {
private:
friend class Sealed;
ClassSealer() {}
};
class Sealed : public ClassSealer
{
// ...
};
class FailsToDerive : public Sealed
{
// This class is capable of being instantiated
};
Run Code Online (Sandbox Code Playgroud)
以上未能封上课,但以下作品,为什么?
class ClassSealer {
private:
friend class Sealed;
ClassSealer() {}
};
class Sealed : public virtual ClassSealer
{
// ...
};
class FailsToDerive : public Sealed
{
// Cannot be instantiated
};
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?虚拟继承在这里发挥了什么作用?
如果可以通过在基类中声明私有构造函数来阻止子类化,为什么我们需要"密封"关键字?是这样的,因为CLI可以更好地优化它吗?也许.
谢谢.
我认为sealed应该包含在C#语言的访问修饰符列表中.有人可以说出它被排除在外的原因吗?
鉴于此接口
public interface IMyInterface
{
string Method1();
}
Run Code Online (Sandbox Code Playgroud)
为什么这是有效的
public sealed class InheretedFromInterfaceSealed: IMyInterface
{
public string Method1()
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但这不是
public class InheretedFromInterfaceWithSomeSealed: IMyInterface
{
public sealed string Method1()
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,它是抽象类的有效场景
public abstract class AbstractClass
{
public abstract string Method1();
}
public class InheretedFromAbstractWithSomeSealed: AbstractClass
{
public sealed override string Method1()
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud) > type XList<'T> (_collection : seq<'T>) =
inherit List<'T> (_collection)
member this.Add _item = if not <| this.Contains _item then base.Add _item
new () = XList<'T> (Seq.empty<'T>);;
inherit List<'T> (_collection)
--------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
stdin(47,9): error FS0945: Cannot inherit a sealed type
Run Code Online (Sandbox Code Playgroud)
我的理解是List <'T>实际上没有密封.没有?
此外,这似乎在F#interactive之外工作得很好.确切的代码在我的F#项目中,编译器处理它而不抱怨.我在几个C#项目中也有同样的事情.代码在每种情况下都按预期工作.
通常,我只是使用静态方法扩展List <'T>(将其作为"F#方式"),但隐藏List.Add也应该正常工作.
如何向密封的 Arc 类添加两个新属性。我想用一个 double 属性来扩展这个类来保存一个 double 值和一个字符串属性来保存对象的名称。我的第一次尝试是通过 Tag 属性,但这只能保存双精度值或对象名称。
问题是我创建了一个包含 43 个圆弧对象的新用户控件,当鼠标进入一个圆弧时,另一个控件会显示输入段的值和名称。所以每个弧都使用 SAME MouseEntered 函数,我想通过“对象发送者”获取信息。
我希望任何人都有一个好主意。
所以我知道可以通过将sealed属性设置为true来密封jar文件中的包,但是可以对清单中的类条目执行相同的操作吗?
如果Boot.class存在或密封仅适用于包,这个密封属性是否可以工作?
例:
Manifest-Version: 1.0 Name: com/myCompany/randompackage/Boot.class Sealed: true
我试图阻止我的基类派生它的方法之一,但似乎不可能按照我喜欢的方式来做,我认为我做错了。
你能帮忙吗?:) 我真的很想成功使用sealed 关键字!
这是一些代码:
public class BaseClass
{
public void MyMethod1(string input)
{
// Doing stuff here
}
public sealed void MyMethod2(string input)
{
// Doing stuff here
}
}
public class DerivedClass : BaseClass
{
// Other fields and stuff over there
}
Run Code Online (Sandbox Code Playgroud)
发生的事情是有问题的,在第一级派生的方法上不允许使用关键字sealed。我只有一个派生级别,我正在寻找的是避免在 DerivedClass 中派生 MyMethod2。
但这似乎不太好:/有什么建议或更正吗?
提前致谢 :)
编辑:经过多次评论和午餐暂停后,我将尝试明确我的问题!
我真正想做的是阻止我的班级使用“她”继承的方法之一。你们中有些人提到使用组合而不是继承,因为我似乎误解了它的含义。
我认为组合只存在于 UML 中而不存在于代码中。C# 代码中的组合听起来像什么?
class X {
sealed protected virtual void F() {
Console.WriteLine("X.F");
}
sealed void F1();
protected virtual void F2() {
Console.WriteLine("X.F2");
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中有编译时错误:
XF()'不能密封,因为它不是替代
X.F1()'无法密封,因为它不是替代
这是否意味着我们只能使用sealed必须覆盖某些方法的关键字whey?
考虑以下课程:
class X {
};
Run Code Online (Sandbox Code Playgroud)
人们可以很容易地继承下去:
class Y : public X {
};
Run Code Online (Sandbox Code Playgroud)
好吧到目前为止......假设我们不希望任何人继承,Y我们可以这样做.
class Y sealed : public X {
};
Run Code Online (Sandbox Code Playgroud)
或者我们可以这样做:
class Y final : public X
};
Run Code Online (Sandbox Code Playgroud)
什么是两个关键字之间的主要差异final和sealed?我知道他们的基本目的和用途; 我只想知道两者之间是否有任何明显的不同.
sealed ×10
c# ×5
inheritance ×3
c++ ×2
.net ×1
constructor ×1
extends ×1
f# ×1
final ×1
interactive ×1
interface ×1
jar ×1
java ×1
list ×1
manifest ×1
oop ×1
overriding ×1
properties ×1
subclass ×1
virtual ×1