【问题标题】:What is the difference between a sealed class and a private class? [duplicate]密封类和私有类有什么区别? [复制]
【发布时间】:2017-11-28 07:41:00
【问题描述】:

我知道一旦使用 sealed 就不能从类继承,但我很困惑这两者之间有什么区别:private 和 sealed?

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

【问题讨论】:

  • 您的问题没有研究证据。你看过文档吗?你知道sealed 关键字的作用吗?你知道private 关键字的作用吗?您是否了解大多数未嵌套在任何其他类中的类首先不能声明为private?此外,您的第二段指的是private 成员,而不是private 类。你问的是哪个?根本不清楚你在问什么。
  • 但是嵌套类可以是 pvt 吗? @PeterDuniho
  • 只有一个嵌套类可以是private。非嵌套类不能,因为在这种情况下,可访问性private 将拒绝该类对每个人的访问。
  • @PeterDuniho 所以 Rohit 给出的答案是错误的,因为他将 1st class abc 作为 pvt 这是错误的?
  • 他回答中的文字表明他明白只有嵌套类可以是private。请注意他的代码示例末尾的其他多余的Page_Load() 方法,这仅在class 声明中才有意义。所以你可能会认为他发布的代码是一个不完整的类声明。在这种假设下,他的答案没有错,只是写得很糟糕(即令人困惑)。

标签: c# .net class oop sealed


【解决方案1】:

private: private 将可见性限制在一个范围内。在类内声明私有类意味着从类外看不到子类。 方法和属性也是如此——它们可以在类中看到,但对任何消费者或继承者都看不到。 private关键字用于声明类。

sealed:如果一个类被声明为sealed,这意味着你不能从这个类继承。 sealed class 可以用于库、类的操作内部的类,或者为什么您不希望该类被覆盖,因为它可能会影响功能。 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 "...........";
            }
       }
}

【讨论】:

  • “子类” 是一个术语,用于描述继承了某个其他类的类。不要用它来描述嵌套类。 C#中没有Private关键字;语言区分大小写,只有private。同样,Sealed 与 sealed。你也没有回答这个问题;上述所有信息都可以在文档中轻松获得。您需要向 OP 解释 区别 是什么,因为这就是他们所要求的。他们本可以自己阅读文档,所以很明显,仅仅解释文档是没有用的。
  • @rohit 你是如何将 1st class 作为 pvt 的?
  • 我不明白你想知道或想问什么请说清楚。我准备解释..在C#中,您可以使用关键字private 将类设为私有。 @Deepak Jain
  • 但只有嵌套类可以是 pvt !! @RohitPoudel
  • 我已经更改了示例@Deepak Jain
【解决方案2】:

您需要了解可继承性和可访问性之间的区别。

如果您想让您的类不可继承,则将其设为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.

因此,如果您将成员设为私有只是为了使它们不可用于继承,那么您也将失去对基类的可访问性。

【讨论】:

    【解决方案3】:

    理解你的困惑,

    1. 首先命名空间内没有独立的私有类,编译器报错。

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

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

    在下面的示例中,您将无法从 Main() 访问方法 privatemethod,但可以访问密封类和密封方法。所以sealed可以访问,但不能继承,这就是区别。

    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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多