2013-08-22 3 views
1

у меня есть и интерфейс следующим образом:Временного решения заставить частный модификатор доступа на реализованном интерфейс собственности

public interface IData 
{ 
    String Name { get; set; } 
} 

А 2 класса, который реализует его:

public class Data1 : IData 
{ 
    public String Name { get; set; } 
} 

public class Data2 : IData 
{ 
    public String Name { get; set; } 
} 

мне нужно, чтобы предотвратить получение Имени a Data2 экземпляр. Компилятор не разрешает следующие формы:

internal String Name { get; set; } 
private String Name { get; set; } 
public String Name { private get; set; } 

Я понимаю логическую причину, по которой это явно не представляется возможным. Доступ к свойствам будет осуществляться с помощью интерфейса, который не имеет понятия о реализованных модификаторах доступа и не сработает, если он не сможет его найти.

Мой случай использования является то, что оба Data1 и Data2 экземпляры должны иметь возможность использовать методы, где IData параметр используется (некоторые из способов, в которых нет использование Name не существует), но Data2 чувствительна и не должны быть доступны непосредственно. Поэтому я ищу обходной путь.

+1

Вы можете явно реализовать интерфейс, а это означает, что вы не можете получить доступ к элементу интерфейса с помощью экземпляров 'Data2' (вы должны указывать на' IData'), но поскольку интерфейсы являются контрактами, все методы на них должны быть общедоступными, когда они реализуются в классе. Вы не можете использовать модификаторы доступа при явной реализации, но приведение к типу интерфейса делает их доступными (как если бы они были общедоступными) – Charleh

ответ

2

Компилятор не позволяет тип, реализующий этот интерфейс для измените это, потому что вы просите его не делать этого. Вы определили интерфейс, который имеет публичный приемник и сеттер.

public interface IData 
{ 
    String Name { get; set; } 
} 

Это звучит, как вам нужно два интерфейса:

public interface ISettableData 
{ 
    String Name { set; } 
} 

public interface IData : ISettableData 
{ 
    String Name { get; set; } 
} 

а реализация:

public class Data1 : IData 
{ 
    public String Name { get; set; } 
} 

public class Data2 : ISettableData 
{ 
    public String Name { set; } 
} 
+0

Это просто блестяще :) Теперь я могу использовать ISettableData в параметрах методов –

5

Похоже, что вы хотите получить доступ к Name через экземпляры Data2, которые будут запрещены. Если это так, то использовать явную реализацию интерфейса

public class Data2 : IData { 
    String IData.Name { 
    get { ... } 
    set { ... } 
    } 
} 

Теперь Name будет доступны только тогда, когда Data2 экземпляров рассматриваются как IData

Data2 obj = new Data2(); 
string name = obj.Name; // Error! 
IData other = obj; 
name = other.Name; // Ok 
+0

Не совсем то, что мне нужно, но интересно знать. Цель заключалась в том, чтобы предотвратить доступ даже при использовании интерфейса. Проверьте ответ от Cory Nelson –

Смежные вопросы