Свойства без «типа свойства» в C # - PullRequest
3 голосов
/ 03 июля 2011

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

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

В 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 в будущем, я могу изменить только в родительском классе.

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

Ответы [ 2 ]

4 голосов
/ 03 июля 2011

Нет, нет.Типы в публичном 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: это несвязанное свойство и не требуется *1009* для того же типа.

0 голосов
/ 03 июля 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...