2009-02-25 6 views
12

Eclipseでセッターとゲッターを生成するときに、クラスメンバーに直接アクセスするのではなく、クラス内でgetterとsetterを使用することができます。このレベルのクラス内部カプセル化は有用か、それともあまりにも良いステップを取っていますか?クラスはいつ自分のゲッター/セッターを使ってメンバーに直接アクセスするべきですか?

デュープShould you use accessor properties from within the class, or just from outside of the class?

+0

[クラス内からアクセサープロパティを使用するか、クラスの外からアクセサープロパティを使用する必要がありますか?](http://stackoverflow.com/questions/476021/should-you-use-accessor-properties-from) -within-the-class-or-just-outside-o) – nawfal

答えて

10

私はあなたが潜在的な副作用が発生する場合、それは良いアイデアだと思う - 検証などをログに記録する(C#では、私は、変数を宣言できるようにしたいと思いますし、変数へのみアクセスはプロパティを通じてであるという特性と言う。)

時折、あなたも、あなたが直接、正確に変数を設定する必要があるかもしれませんあなたは副作用を望んでいんので。たとえば、2つの変数を一緒に設定する必要があり、「前」状態と「後」状態の両方が有効ですが、いずれかのプロパティを個別に設定すると検証が爆発的になります。

3

派生クラスがgetterを再定義できるようにすると便利です。したがって、クラスの内部からでもgettersを使用すると、デザインが拡張可能になります。

私の意見では、これはコーディングガイドラインで定義する必要があるものです。

0

たとえば、ダーティーフラグを設定する、またはオブザーバーに通知するなどの特別な操作を行う設定者がいる場合に便利です。

ゲッターの場合、フィールドにアクセスする代わりに、表現を変更するときに値を計算することができます。

0

私は時々、特に私が必要とするとき、あるいは強く期待しているときに、メンバーを取得したり設定したりするためのログインを強く期待しています。

これらのケースでは、プライベート/内部プロパティを持つことが役に立ちます。

しかし、私は確かにどのメンバーにとってもそれをしません。

最新の.NET/VSは本当にあなたのようなプロパティを宣言することができ、ここで助け:

public string SomeProperty 
{ 
get; 
set; 
} 

、それが効果的にシーンの背後にあるmemebrを作成します。

0

このメンバーがWinformまたはWPFのいずれかでデータをバインドできるようにしたいのであれば、私はあなたがそれを宣言する必要があると信じています。プロパティ。私は、データバインディングにプロパティ(ゲッター/設定構文)が必要であると約95%の肯定的な立場です。私はこれを実証する小さなwpfソリューションを持っていますが、ここにそれを取り付ける方法はありません。

コードは次のとおりです。(VS 2008 SP1、target .net 3.5でビルド - 私はWPFプロジェクトを使用しました) WPFプロジェクト、メインウィンドウ(window1)、およびテスト対象のオブジェクト(DataObject)に2つの項目があります。 データオブジェクトのインスタンスのNameプロパティにデータバインドされているラベルがウィンドウにあります。 Nameプロパティをフィールドに変換すると(getter/setterを削除する)、データバインディングは機能しなくなります。

Window1。XAML:

<Window x:Class="WpfDatabinding.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Grid> 
    <Label Name ="Label1" Height="28" Margin="12,24,37,0" VerticalAlignment="Top" Content="{Binding Name}"></Label> 
</Grid> 

Window1.xaml.cs

using System; 
using System.Windows; 

namespace WpfDatabinding 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     private DataObject ADataObject; 

     public Window1() 
     { 
      InitializeComponent(); 
      this.ADataObject = new DataObject(); 
      this.ADataObject.Name = "Hello!"; 
      this.DataContext = this.ADataObject; 
     } 
    } 
} 

namespace WpfDatabinding 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     private DataObject ADataObject; 

     public Window1() 
     { 
      InitializeComponent(); 
      this.ADataObject = new DataObject(); 
      this.ADataObject.Name = "Hello!"; 
      this.DataContext = this.ADataObject; 
     } 
    } 
} 

DataObject.cs:

namespace WpfDatabinding 
{ 
    public class DataObject 
    { 
     // convert this to a field, and databinding will stop working 
     public string Name 
     { 
      get; 
      set; 
     } 
    } 
} 
3

短い答えはある:)

"それが依存します"エリック・リッパートはAutomatic vs. Explicit propertiesは、わずかに異なる角度からではありますが、この問題を扱っています。クラス内から

」、これにアクセスして、所望の意味論[は] ...プロパティからプロパティにアクセスするの所望のセマンティクスが異なる:

基本的に、あなたが依頼する必要があります質問です外側?"

セマンティクスが同じ場合、クラスは独自のプロパティを使用する必要があります。セマンティクスが異なる場合、クラスはバッキングフィールドを直接操作する必要があります。

0

クラスのゲッター/セッターの動作を拡張する必要がある場合は、カプセル化フィールド(直接メンバーアクセスではなくゲッター/セッター)を使用すると便利です。 しかし、継承では、そのサブクラスがプライベートなものを認識してはならない場合、クラスの内部を保存することは概念的に面白いです。だから、時にはフィールドがクラスの実装にプライベートなので、サブクラスでさえそれを認識しないことがあります。

関連する問題