Вопрос о Наследовании C#

Добавить к bhadra's список из идиоматических руководств:

представление Checkout Anthony Baxter Эффективное Программирование Python (с 2005 OSON).

выборка:

# dict's setdefault method turns this:
if key in dictobj:
    dictobj[key].append(val)
else:
    dictobj[key] = [val]
# into this:
dictobj.setdefault(key,[]).append(val)

6
задан JL. 8 September 2009 в 09:19
поделиться

4 ответа

Вы должны объявить их как «защищенные», а не частные

11
ответ дан 8 December 2019 в 02:05
поделиться

Один (плохой) вариант - сделать поля защищенными - но не делайте этого; он по-прежнему нарушает правильную инкапсуляцию. Два хороших варианта:

  • сделать сеттер 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") {}
}
20
ответ дан 8 December 2019 в 02:05
поделиться

Предложение Филиппа объявить поля как protected вместо private действительно сработает, но я предлагаю вам не делать этого в любом случае.

Зачем это нужно производный класс заботится о деталях реализации того, как хранятся данные? Я предлагаю вам раскрыть защищенные свойства , которые (в настоящее время) поддерживаются этими полями, вместо того, чтобы открывать сами поля.

17
ответ дан 8 December 2019 в 02:05
поделиться

Вероятно, вы ищете концепцию, называемую наследованием конструктора. Вы можете передать аргументы конструктору базовых классов - см. Этот пример, где у Audi есть флаг, указывающий, является ли это выпуск 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...
    }
}    }
5
ответ дан 8 December 2019 в 02:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: