2017-10-20 79 views
5

Bir ana sınıf tarafından uygulanan iki arabirim var. Kodumu her bir sözleşmenin uygulanmasında, her bir sözleşmenin yöntemlerinin VeritabanıAdı gibi bir parametre için farklı bir değere sahip olacak şekilde nasıl yeniden kodlandırabilirim.Sözleşmeler için farklı özellik değeri

Örnek:

  1. Sınıf1 uygular Interface1, Interface2
  2. Interface1.GetData() Veri 1
  3. Interface2.GetData (üzere VeritabanıAdı grubu vardır) Veri 2
için VeritabanıAdı seti vardır

Bu değeri GetData() yöntemlerinde yapılandırabilirim ancak bunu daha temiz bir şekilde yapmak istiyorum.

Herhangi bir desen önerisi, DI, Etki alanı tarafından çalıştırılan, hatta temel öznitelik örneğinin, yukarıdakileri gerçekleştiren, benim aradığım şey olduğudur. İhtiyacınız olan tüm explicit interface implementation olduğu gibi

cevap

7

geliyor:

public class Class1 : Interface1, Interface2 
{ 
    // Note the lack of access modifier here. That's important! 
    Data Interface1.GetData() 
    { 
     // Implementation for Interface1 
    } 

    Data Interface2.GetData() 
    { 
     // Implementation for Interface2 
    } 
} 

Açıkçası iki yöntem veritabanı adını veya benzeri belirtmek için bir parametre ile ortak yöntemini çağırabilirsiniz.

+0

Aklım sadece Jon skeet'in yeni sorulara cevap verdiğini, yani her iki arayüzde de 100 metodum varsa ne olur? –

+0

@ZohaibAmin: O zaman, başlangıç ​​için çok büyük olan arayüzler konusunda oldukça endişeliyim. Uygulamanızın farklı olmasını istediğiniz yöntemlerde yalnızca açık uygulamayı kullanmanız gerekir - örtülü ve açık arabirim uygulamasını karıştırabilirsiniz. –

0

Refactoring genellikle bir kod kokusu fark ederek ve aynı işlevselliği açığa çıkaran 2 soyutlamayı uygulamak zorunda olduğunuz bir durumda sona erdiğin gerçeği, kod kokusu olan kokusuyla motive olur. Sorunu daha fazla anlayamadan, size kesin bir cevap veremeyebilirdim, ancak sınırlı bir anlayışla bu benim önereceğim şeydi. Her biri tek bir arayüz uygulayan ve müşteriye enjekte edilecek ve müşterinin bu uygulamadan hangisinin gerekli olduğuna dair kasıtlı bir karar vermesini sağlayan 2 farklı somut uygulama var. Bu somut sınıfların ortak işlevselliği paylaşması durumunda, bunu daima ortak bir ana sınıfa aktarabilirsiniz.

public interface ISQLReader 
    { 
     string GetData(); 
    } 

    public interface IOracleReader 
    { 
     string GetData(); 
    } 

    public abstract class Reader 
    { 
     protected void CommonFunctionaility() 
     { 

     } 
    } 
    public class MSSQLReader : Reader, ISQLReader 
    { 
     public string GetData() 
     { 
      return "MSSQL"; 
     } 
    } 

    public class OracleReader : Reader, IOracleReader 
    { 
     public string GetData() 
     { 
      return "Oracle"; 
     } 
    } 

    public interface IReaderFactory 
    { 
     OracleReader CreateOracleReader(); 
     MSSQLReader CreateMSSQLReader(); 
    } 

    public class ReaderFactory : IReaderFactory 
    { 
     public MSSQLReader CreateMSSQLReader() => new MSSQLReader(); 

     public OracleReader CreateOracleReader() => new OracleReader(); 
    } 

    public class ReaderClient 
    { 
     private IReaderFactory _factory; 
     public ReaderClient(IReaderFactory factory) 
     { 
      this._factory = factory; 
     } 
    } 

Açık arabirim uygulaması istemci yaptı ve kasıtlı bir karar vererek orada açık döküm kadar işlevsellik kullanımını kısıtlamak gerekir tekniktir.

İlgili konular