我正在浏览一些C#代码以扩展VS2010中的语言支持(好的示例)。我看到一些课internal sealed class
这些是做什么的?一个人会使用它们吗?
Answers:
这是一个类:
internal
:只能从定义的程序集(或好友程序集)中访问。sealed
:无法继承。将类标记为asinternal
是防止程序集的外部用户使用它们的一种方法。这实际上是设计封装的一种形式,恕我直言,将不属于预期的公共API \对象模型的类型标记为是一种很好的做法internal
。从长远来看,这可以防止您的库用户将自己耦合到您不希望他们使用的类型。这种意外的耦合会损害您更改和发展库实现方式的能力,因为在不破坏客户的情况下就无法更改它们。使用internal
有助于使图书馆的公共和可用表面积保持在预期范围内。
将类标记为会sealed
阻止这些类被继承。这是一个非常激烈的设计意图,如果一个类已经非常专门化,以至于明智的做法是不应该通过继承直接或通过覆盖其行为来向其添加任何其他功能,则有时这很有用。
internal
并sealed
以完全不同的方式修改类型,但是它们可以一起使用。
注意:您可以进一步internal
定义范围,因为您可以将一组其他程序集定义为“好友”。这些朋友程序集可以访问您的internal
类型。这对于定义协作组件集(例如生产和测试组件)很有用。通常希望测试程序集可以看到它正在测试的程序集中的所有类型。
InitializeObject
方法。好吧,谁能说它仍然可以正常工作?
InitializeObject
为“sealed
如果我不想允许继承”是否更好?
内部
内部类型或成员只能在同一程序集中的文件中访问。
例
// Assembly1.cs
// Compile with: /target:library
internal class BaseClass
{
public static int intM = 0;
}
// Assembly1_a.cs
// Compile with: /reference:Assembly1.dll
class TestAccess
{
static void Main()
{
var myBase = new BaseClass(); // compile error
}
}
密封
首先,让我们从定义开始。密封是一个修饰符,如果将其应用于类使其不可继承,并且如果将其应用于虚拟方法或属性将使其变为非ovveridable。
public sealed class A { ... }
public class B
{
...
public sealed string Property { get; set; }
public sealed void Method() { ... }
}
其用法的一个示例是专门的类/方法或属性,其中潜在的更改可能会使它们停止按预期方式工作(例如,System.Drawing命名空间的Pens类)。
...
namespace System.Drawing
{
//
// Summary:
// Pens for all the standard colors. This class cannot be inherited.
public sealed class Pens
{
public static Pen Transparent { get; }
public static Pen Orchid { get; }
public static Pen OrangeRed { get; }
...
}
}
由于密封类不能继承,因此不能用作基类,因此抽象类不能使用密封修饰符。同样重要的是要提到结构是隐式密封的。
例
public class BaseClass {
public virtual string ShowMessage()
{
return "Hello world";
}
public virtual int MathematicalOperation(int x, int y)
{
return x + y;
}
}
public class DerivedClass : BaseClass {
public override int MathematicalOperation(int x, int y)
{
// since BaseClass has a method marked as virtual, DerivedClass can override it's behavior
return x - y;
}
public override sealed string ShowMessage()
{
// since BaseClass has a method marked as virtual, DerivedClass can override it's behavior but because it's sealed prevent classes that derive from it to override the method
return "Hello world sealed";
}
}
public class DerivedDerivedClass : DerivedClass
{
public override int MathematicalOperation(int x, int y)
{
// since BaseClass has a method marked as virtual, DerivedClass can override it's behavior
return x * y;
}
public override string ShowMessage() { ... } // compile error
}
public sealed class SealedClass: BaseClass {
public override int MathematicalOperation(int x, int y)
{
// since BaseClass has a method marked as virtual, DerivedClass can override it's behavior
return x * y;
}
public override string ShowMessage()
{
// since BaseClass has a method marked as virtual, DerivedClass can override it's behavior but because it's sealed prevent classes that derive from it to override the method
return "Hello world";
}
}
public class DerivedSealedClass : SealedClass
{
// compile error
}
Microsoft文档