C#中没有“属性类型”的属性

时间:2011-07-03 11:47:29

标签: c# delphi c#-4.0 types accessor

我正在将Delphi代码转换为C#。

我有一个复杂的类结构,其中一个类是其所有孩子的主要'trunk'

在Delphi中,我可以使用相同类型的类型和属性来定义private / protected字段,而不再在子类中写入类型。

这是一个有点(和功能)的例子:

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 个答案:

答案 0 :(得分:4)

不,有。公共API上的类型必须是显式的。唯一不明确的是var,它仅限于方法变量。

此外,您无法更改C#中的签名(在子类中添加公共getter) - 您必须重新声明它:

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

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

但正如new所暗示的那样:这是一个不相关的属性,不需要具有相同的类型。

答案 1 :(得分:0)

据我所知,你可以这样做:

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);
    }
}