代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

继承问题

  •  6
  • JL. Hans Passant  · 技术社区  · 15 年前

    我有一个有私人领域的班级…(汽车)

    然后我继承了这个阶级…(奥迪)

    在(奥迪)课上,我打字的时候。在构造函数中…

    私有字段不可用…

    我需要做什么特殊的事情来在(cars)类中公开这个私有字段,以便可以通过这个访问它们吗?在(奥迪班)?

    4 回复  |  直到 15 年前
        1
  •  11
  •   Philippe Leybaert    15 年前

    你应该声明它们是“受保护的”,而不是私有的。

        2
  •  20
  •   Marc Gravell    15 年前

    一个(坏的)选择是使字段 protected -但不要这样做,它仍然会破坏适当的封装。两个好的选择:

    • 使 设定器 受保护的
    • 提供接受值的构造函数

    实例:

    public string Name { get; protected set; }
    

    (C(2))

    private string name;
    public string Name {
        get { return name; }
        protected set { name = value; }
    }
    

    或者:

    class BaseType {
      private string name;
      public BaseType(string name) {
        this.name = name;
      }
    }
    class DerivedType : BaseType {
      public DerivedType() : base("Foo") {}
    }
    
        3
  •  17
  •   Jon Skeet    15 年前

    Philippe建议将字段声明为 protected 而不是 private 确实有效-但我建议你无论如何不要这样做。

    为什么派生类应该关心 实施详细信息 如何存储数据?我建议你暴露保护 属性 它们(当前)由这些字段支持,而不是公开字段本身。

    我将您向派生类公开的API视为与您向其他类型公开的API非常相似——它应该是一个比您稍后可能要更改的实现细节更高级别的抽象。

        4
  •  5
  •   Marc Wittke    15 年前

    您可能正在寻找一个名为构造函数继承的概念。您可以将参数转发给基类构造函数-请参见本例,其中奥迪有一个标志,指示它是否是S行版本:

    namespace ConstructorInheritance
    {
        abstract class Car
        {
            private int horsePower;
            private int maximumSpeed;
    
            public Car(int horsePower, int maximumSpeed)
            {
                this.horsePower = horsePower;
                this.maximumSpeed = maximumSpeed;
            }
        }
    
        class Audi : Car
        {
            private bool isSLineEdition = false;
    
            // note, how the base constructor is called _and_ the S-Line variable is set in Audi's constructor!
            public Audi(bool isSLineEdition, int horsePower, int maximumSpeed)
                : base(horsePower, maximumSpeed)
            {
                this.isSLineEdition = isSLineEdition;
            }
        }
    
        class Program
    {
        static void Main(string[] args)
        {
            Car car = new Audi(true, 210, 255);
            // break here and watch the car instance in the debugger...
        }
    }    }