2016-04-15 5 views
1

私はpublic abstract A : IVirtualMachineExporterに次のような方法があります。別に一つのクラスからのデータを使用する方法?

public override void Prepare() { ... } 

私は別のクラスBからPrepareを呼び出す:public bool isAdHoc { get; set; }を含む

public sealed class B 
{ 
    public new ExportJobRequest Request { get { return (ExportJobRequest)base.Request; } } 

    private void ExportTask() 
    { 
      IVirtualMachineExporter exporter = CreateExporter(); 
      exporter.Prepare(); 
    } 
} 

Request。私はPrepare()の内側に、このプロパティからの情報を使用したいです。これどうやってするの?私はPrepare()署名を変更する必要はありません。

+0

isAdHocはプライベートで保護されたパッケージアクセスですか? –

+0

質問が更新されました –

+0

'Prepare'の署名を変更しないと簡単にこれを行う方法はありません。 – Tim

答えて

2

どのように私は署名を準備変更せずにこれを行うことができますか?

まあ、何とかPrepareはあなたがクラスまたはインタフェースを変更することができ、あなたが方法署名を変更したくないので、もし、上isAdHocを呼び出すためにインスタンスを必要ですか?クラスAでは

 IVirtualMachineExporter exporter = CreateExporter(Request); 
     exporter.Prepare(); 

または

 IVirtualMachineExporter exporter = CreateExporter(); 
     exporter.Request = Request; 
     exporter.Prepare(); 
0

、パブリックプロパティIsAdhocを公開:よう

何か。前だから... ...

クラスA

public bool IsAdhoc { get; set; } 

// Inside this method, do something based on the IsAdhoc property above. 
public override void Prepare() { ... } 

クラスB

クラスB

から準備を呼び出すには、クラスAのIsAdhocプロパティを設定し

public sealed class B 
{ 
    public new ExportJobRequest Request { get { return (ExportJobRequest)base.Request; } } 

    private void ExportTask() 
    { 
      IVirtualMachineExporter exporter = CreateExporter(); 
      exporter.IsAdhoc = this.Request.isAdhoc; 
      exporter.Prepare(); 
    } 
} 

または、ブール値をCreateExporterメソッドに渡すことができます。このメソッドは、コンストラクタを介して新しいエクスポータクラスに設定できます。

0

BIVirtualMachineExporterに依存し、IVirtualMachineExporterA)の実装はRequestに依存ように見えます。 Bは、Aまたはそれが依存するものについては何も知らないはずです。それだけでIVirtualMachineExporterインターフェースとPrepare()を呼び出すことを気にする必要があります。

あなたはこのようにそれを作成することができます。Bのコンストラクタにインタフェース(ない具体的な実装を)渡し、同様

public abstract class A : IVirtualMachineExporter 
{ 
    private readonly ExportJobRequest _request; 

    public A(ExportJobRequest request) 
    { 
     _request = request; 
    } 

    public override void Prepare() 
    { 
     //Now Prepare() has access to the Request because 
     //it's contained within A, the class that actually needs it. 
    } 
} 

public sealed class B 
{ 
    private readonly IVirtualMachineExporter _exporter; 

    public B(IVirtualMachineExporter exporter) 
    { 
     _exporter = exporter; 
    } 

    private void ExportTask() 
    { 
     //Can this isAdhoc property be a property of IVirtualMachineExporter, 
     //or can the Request be a property? Will every implementation of the 
     //interface have a request? 

     //exporter.IsAdhoc = this.Request.isAdhoc; 
     _exporter.Prepare(); 
    } 
} 

私はあなたのデザインの詳細を持っていません。しかし、Bがインターフェイス(IVirtualMachineExplorer)に依存する場合、インターフェイスを実装するクラスの内部の詳細を知らないでください。

関連する問題