【问题标题】:C# subclass or interface?C# 子类还是接口?
【发布时间】:2014-11-06 01:59:56
【问题描述】:

对 C# 很陌生——我被指示创建一个子类来对基类进行变体。以前从来没有做过子类,我读了一点,然后试了一下。从基类继承后,我只能从子类访问 MyClass 的私有属性。我在这里做了什么?这是一个真正的子类,还是某种嵌套的继承?

    public class MyClass
{
     private string connString;
     // exec stored procedure 1

     public class MySubClass : MyClass
     {
            otherClass o = new otherClass(connString);
            // exec stored procedure 2
     }
}

无论我做什么,它似乎都有效。 另外,关于子类的话题,是否有一种通用的方式来命名它们?例如MyClass_SubClass 还是 _MyClass 等?

非常感谢!

编辑:再次感谢大家!我想我正在寻找这个答案here。无论如何,我意识到我误解了这项任务——根本不需要嵌套或继承!刚刚创建了一个单独的类似类。

【问题讨论】:

  • 我不太明白您的问题,但是您可以访问 outer 类的私有字段的原因是它包含了您进行访问的内部类.它与子类化没有任何关系。
  • 我只能在从基类继承时访问私有字段,这令人困惑。更改为 protected 允许我将嵌套类移到基础之外并且仍然可以访问该字段。

标签: c# inheritance subclass


【解决方案1】:

你已经嵌套你的类,在你更好地理解 C# 和 OOP(然后你继承,这很奇怪)之前,你应该避免这种情况。

子类化或派生,是通过继承完成的。在您的示例中:

public class MyClass
{
     private string connString;
     // exec stored procedure 1
}

public class MySubClass : MyClass
{
      otherClass o = new otherClass(connString);
      // exec stored procedure 2
}

要允许MySubClass 访问MyClass 的成员,该成员需要标记为protected 或更高版本。 private 成员不能在包含类之外访问。

public class MyClass
{
     protected string connString;
     // exec stored procedure 1
}

【讨论】:

  • @KirkWoll 我并不是说没有有效的用例,但是作为初学者,他应该使用正常的继承,然后在他可以理解的情况下使用嵌套类.我个人认为嵌套类是一种代码味道,但这只是我的看法。
【解决方案2】:

MySubClass 实际上是 MyClass.MySubClass。通常,普通子类不能访问私有成员。

一个普通的子类将作为一个独立的类在一个单独的文件中。如果应该允许子类访问基类成员,那么您应该将它们声明为“受保护”而不是“私有”。

一个命名的主体,通常名称代表类型,与基类无关。例如,如果您有一个 Animal 的基类,那么您有一个名为 Dog 和 Cat 的子类是合理的。或者在 Windows 中,您可以有一个名为 Control 的基类和名为 Button、TextBox、Label 等的子类。

【讨论】:

    【解决方案3】:

    您的代码是有效的,它并没有完全实现您被指示实现的内容。您可以在类中声明一个类。使用您的代码,您可以按如下方式实例化这两个类。

    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            MyClass.MySubClass mySubClass = new MyClass.MySubClass();
        }
    }
    

    这很不寻常,在一个类中声明一个类并不罕见,但通常您不会将 MySubClass 声明为 public,而是将其声明为 private 或 protected。就这样……

    public class MyClass
    {
        private string connString;
        private MyClassHelper mySubClass = new MyClassHelper();
    
        // exec stored procedure 1
    
        protected class MyClassHelper
        {
            object o = new object();
            // exec stored procedure 2
        }
    }
    

    ...所以 MyClassHelper 只存在于 MyClass 的范围内。我从来没有见过内部类继承外部类的代码,它编译得很好,你永远不会这样做,你可以轻松创建循环引用。

    BradleyDotNET 的回答告诉您如何实现 MyClass 的子类。这也称为继承在这里阅读更多关于它...http://msdn.microsoft.com/en-us/library/ms173149(v=vs.80).aspx

    作为警告,我不会对类继承过于疯狂,相比之下class inheritance is quite restrictive 类之间存在多种类型的关系。

    您的问题的标题是子类或接口。 Interfaces 是您应该关注和理解的东西,它们非常重要,尤其是对于实现 SOLID 代码。在我的代码中,类继承接口比继承类更常见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2011-07-16
      相关资源
      最近更新 更多