密封班和私人班有什么区别?

时间:2017-06-25 04:37:18

标签: c# .net class oop sealed

我知道您在使用sealed后无法继承课程,但我很困惑这两者之间有什么区别:privatesealed

如果我们不想继承它们而不是整个班级,我们不能让基类成员private成立吗?使用sealed class有什么意义?

3 个答案:

答案 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是最佳选择。另外,课程不能是protectedprivateinternal protected。只有子类才能拥有这些访问说明符。直接位于命名空间下的普通类只能是publicinternal

现在向您提出要让所有成员在基类中保密。这样做没有任何意义。

继承类只是为了重用某些属性和/或方法,或者在继承的类中覆盖它们。如果你在基类中使所有成员都是私有的,那么即使使用基类对象,你也无法访问它们。 那么在基类中拥有它们的重点是什么。

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)

了解您的困惑,

  1. 首先,名称空间中没有独立的私有类,编译器将引发错误。

  2. 如果在公共类A中将方法void m1()设为私有,则无法从公共类B访问方法m1

  3. 密封类可以停止继承,但其他类也可以访问,这意味着您不能使用它来派生继承。

在下面的示例中,您将无法从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();
        }
    }
}