Свойства без «типа свойства» в С#

Я конвертирую код Delphi в С#.

У меня есть сложная структура классов, в которой класс является основным стволом всех своих дочерних элементов.

В Delphi я могу определить частное/защищенное поле с типом и свойство для этого поля с тем же типом и больше не писать тип в дочерних классах.

Вот небольшой (и функциональный) пример:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  Parent = class
  strict protected
    _myFirstField: Int64;
  public
    property MyFirstField: Int64    write _myFirstField;
  end;

  Child1 = class(Parent)
  public
    // Inherits the write/set behaviour..
    // And it doesn't need to define the type 'over and over' on all child classes.
    //
    // ******* Note MyFirstField here has not type.... ************
    property MyFirstField        read _myFirstField;  // Adding READ behaviour to the property.
  end;

var
  Child1Instance: Child1;
begin
    Child1Instance := Child1.Create;
    //Child1Instance.MyFirstField := 'An String';  <<-- Compilation error because type
    Child1Instance.MyFirstField := 11111;
    WriteLn(IntToStr(Child1Instance.MyFirstField));
    ReadLn;
end.

Как видите, мне не нужно снова и снова определять тип свойства. Если мне нужно будет изменить тип var в будущем, я могу изменить только в родительском классе.

Есть ли способ получить такое же поведение в С#?


person ferpega    schedule 03.07.2011    source источник
comment
Покажите, что вы пробовали в C #, пожалуйста. В соответствии с обычным ООП вы можете иметь защищенное свойство в базовом классе, и оно будет доступно в дочерних классах вместе с set/get и, конечно, сохранит определение его типа.   -  person Davide Piras    schedule 03.07.2011
comment
Разве поведение частных/защищенных свойств С# точно такое же?   -  person Petr Abdulin    schedule 03.07.2011
comment
Действительно, я должен возобновить то, что я хочу сделать: у меня есть все возможные свойства, объявленные в классе-предке, и я хотел бы опубликовать только набор этих свойств в дочерних классах. Без повторного объявления всего свойства... ни типа, ни аксессоров.   -  person ferpega    schedule 03.07.2011
comment
Нет, в C# нет шаблона для увеличения видимости члена в производном классе. Вам нужно создать совершенно новое свойство, как в ответе Марка Гравелла.   -  person CodesInChaos    schedule 03.07.2011


Ответы (2)


Нет, есть. Типы в общедоступном API должны быть явными. Единственный раз, когда вы не являетесь явным, это с var, который ограничен переменными метода.

Кроме того, вы не можете изменить подпись в C# (добавив публичный геттер в подклассе) — вам придется объявить ее заново:

// base type 
protected string Foo {get;set;}

// derived type
new public string Foo {
    get { return base.Foo; }
    protected set { base.Foo = value; }
}

Но, как подсказывает new: это несвязанное свойство и не обязательно иметь один и тот же тип.

person Marc Gravell    schedule 03.07.2011
comment
Спасибо, Марк... Тогда я должен переписать все поведение для одного и того же свойства Foo, даже если это поведение будет таким же, не так ли? :-( - person ferpega; 03.07.2011
comment
@FerPt нет, просто прокси для base. как в моем примере - person Marc Gravell; 03.07.2011

Насколько я понимаю, можно сделать так:

public class Parent
{
    protected Int64 MyCounter{ get; set; }
}

public class Child : Parent
{
    protected string ClassName 
   { 
        get 
        {
            return "Child";
        }
    }
}

public class Runner
{
    static void Main(string[] args)
    {
        var c = new Child();
        c.Counter++;

        Console.WriteLIne(c.Counter);
    }
}
person TheVillageIdiot    schedule 03.07.2011