我有一个有私人领域的班级......(汽车)
然后我继承了这个班级......(奥迪)
在(奥迪)课上,当我打字时。在构造函数中......
私人字段不可用...
我是否需要做一些特别的事情来公开(汽车)类中的私有字段,以便通过它可以访问它们。在(奥迪班)?
答案 0 :(得分:20)
一个(坏)选项是创建字段protected
- 但不要这样做;它仍然打破了适当的封装。两个不错的选择:
的示例:
public string Name { get; protected set; }
(C#2.0)
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") {}
}
答案 1 :(得分:17)
Philippe建议将字段声明为protected
而不是private
确实有效 - 但我建议你不要这样做。
为什么派生类需要关注数据存储方式的实现细节?我建议您公开受这些字段(当前)支持的受保护的属性,而不是自己公开字段。
我将您公开的API视为与您向其他类型公开的API非常相似 - 它应该是比您稍后可能想要更改的实现细节更高级别的抽象。
答案 2 :(得分:11)
您应该将它们声明为“受保护”而不是私有
答案 3 :(得分:5)
您可能正在寻找一种称为构造函数继承的概念。您可以将参数转发给基类构造函数 - 请参阅此示例,其中奥迪有一个标记,指示它是否是S-Line版本:
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...
}
} }