2011-07-03 4 views
3

私はDelphiコードをC#に変換しています。C#の 'プロパティタイプ'のないプロパティ

クラスがメインの「トランク」のすべての子である複合クラス構造を持っています。

デルファイでは、同じタイプのフィールドのプロパティとタイプを持つプライベート/保護フィールドを定義し、そのタイプをもう子クラスに書き込むことはできません。ここで

はビット(および機能)の例である:

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#で同じ動作をする方法はありますか?

+3

は、あなたがC#でくださいしようとしたものを表示します。通常のOOPのように、基本クラスで保護されたプロパティを持つことができます。これは、set/getと一緒に子クラスで利用できるようになり、その型定義ももちろん保持されます。 –

+0

C#private/protectedプロパティの動作はまったく同じではありませんか? –

+0

真剣に私がやりたいことを再開する必要があります:祖先クラスで宣言されたすべてのプロパティがあり、そのプロパティのセットだけを子クラスに「公開」したいと思います。すべてのプロパティを宣言せずに...型もアクセサーもありません。 – ferpega

答えて

4

いいえ、ありません。パブリックAPIの型は明示的でなければなりません。あなたが明示的でない唯一の時間は、メソッド変数に限定されているvarです。

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

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

をしかしnewの通り: -

さらに、あなたがC#で署名(サブクラスでパブリックゲッターを追加)を変更することはできません、あなたはそれを再宣言しなければならない、これはあります関連性がなく、は必要ありませんは同じタイプです。私の知る限り、あなたはこのように行うことができます理解し

+0

ありがとうMarc ....そして、この動作が同じであっても、 "同じ" Fooプロパティのすべての動作を書き直す必要がありますか? :-( – ferpega

+0

@FerPtいいえ、私の例のように 'base.'に代理するだけです –

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