我正在将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#中获得相同的行为?
答案 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);
}
}