我知道您在使用sealed
后无法继承课程,但我很困惑这两者之间有什么区别:private
和sealed
?
如果我们不想继承它们而不是整个班级,我们不能让基类成员private
成立吗?使用sealed class
有什么意义?
答案 0 :(得分:4)
私有: private
将可见性限制在范围内。在类中声明私有类意味着不能从类外部看到子类。
对于方法和属性也是如此 - 它们可以在类中看到,但不能在任何使用者或继承者中看到。
private
关键字用于声明类。
密封:如果某个类声明为sealed
,则表示您无法继承该类。当一个类是库的操作内部,类或者为什么不希望覆盖该类时,可以使用sealed
类,因为它可能会影响该功能。
sealed
关键字用于声明类
例如
public class Parent {
// some thing at here
private readonly SubClass sc;
// ctor
public Parent () {
sc = new SubClass();
}
public string foo () {
return sc.bar();
}
private class SubClass {
// have some thing here
public string bar() {
//..............
return "...........";
}
}
}
答案 1 :(得分:0)
您需要了解可继承性和可访问性之间的区别。
如果您想让您的课程不可继承,那么将其设为sealed
是最佳选择。另外,课程不能是protected
,private
或internal protected
。只有子类才能拥有这些访问说明符。直接位于命名空间下的普通类只能是public
或internal
。
现在向您提出要让所有成员在基类中保密。这样做没有任何意义。
继承类只是为了重用某些属性和/或方法,或者在继承的类中覆盖它们。如果你在基类中使所有成员都是私有的,那么即使使用基类对象,你也无法访问它们。 那么在基类中拥有它们的重点是什么。
public class MyClass
{
private void MyMethod() //You can not inherit this method but you can not use it using 'MyClass' also.
{
//Some code.
}
}
MyClass myObj = new MyClass();
myObj.MyMethod(); // You can not do this as the method is private.
现在,如果你在另一个类中继承这个类
public ChildClass : MyClass
{
public void ChildMethod()
{
// Some Logic
}
}
现在你做的时候
MyClass obj = new ChildClass();
你做不到
obj.MyMethod(); //coz this is private method.
你也不能这样做。
obj.ChildMethod(); //coz that method is not known to MyClass.
因此,如果您为了使它们不可用于继承而将成员设为私有,那么您也将失去基类的可访问性。
答案 2 :(得分:0)
了解您的困惑,
首先,名称空间中没有独立的私有类,编译器将引发错误。
如果在公共类A中将方法void m1()
设为私有,则无法从公共类B访问方法m1
。
密封类可以停止继承,但其他类也可以访问,这意味着您不能使用它来派生继承。
在下面的示例中,您将无法从Main()访问方法privatemethod
,但是可以访问密封类和密封方法。这样密封就可以访问,尽管不能继承,这就是区别。
namespace ConsoleApp1
{
using System;
public class A
{
public virtual void test()
{
Console.WriteLine("Class A");
}
}
public class C
{
public void testSealFromOutsideClass()
{
B instanceB = new B();
instanceB.test();
}
}
public sealed class B : A
{
public override void test()
{
Console.WriteLine("Class B");
}
private void Privatemethod()
{
Console.WriteLine("Printing from a private method");
}
}
//public class C : B {}
public class TestSealedClass
{
public static void Main()
{
A a = new B();
a.test();
C c = new C();
c.testSealFromOutsideClass();
B b = new B();
Console.Read();
}
}
}