2013-02-21 6 views
2

У меня есть один интерфейс, как показано нижеКак предотвратить использование других методов интерфейса?

public interface I1 
{ 
public int add(int a , int b); 

public int subtract (int a, int b); 

} 

public class Myclass : I1 
{ 
//here I can access both the methods of interface I1 
//add and subtract but i want to expose only add not subtract method 
//How can I achieve this? 

} 

Как я могу выставить только конкретный метод и предотвратить другие.

+1

Вы не можете предотвратить это, но вы можете «скрыть» метод по типу 'Myclass' (но не типа' I1') с помощью [Явные реализации интерфейса] (http://msdn.microsoft.com/en-us/ library/aa664591 (v = vs.71) .aspx): «* Явная реализация элемента интерфейса может быть доступна только через экземпляр интерфейса * и в этом случае ссылается просто на имя его члена». – 2013-02-21 07:13:19

ответ

2

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

public class MyClass { 
    public int I1.subtract(int a, int b) { 
     throw new NotImplementedException(); 
    } 
} 

Когда это сделано, как этот Вычесть будет виден только когда object является литая, как I1

3

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

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

1

концепция интерфейса говорит, что вы if you implement an interface you need to implement all the methods, так что я думаю, что это не может быть сделано

Далее больше методов по умолчанию для interface являются public
Итак, когда вы собираетесь его определения, оно должно быть только public.
Вот ссылка для лучшего понимания Interfaces
http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners
Вот ссылка, которая показывает разницу между Interface и abstract class
http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

1

Не знаю, почему вам нужно такое поведение. Если вы хотите просто один из способов, чтобы быть доступными для объекта MyClass, вы можете использовать явную реализацию интерфейса для этого конкретного метода

public class Myclass : I1 
    { 
     public int add(int a, int b) 
     { 
      return 1; 
     } 

     public int I1.subtract(int a, int b) 
     { 
      return 2; 
     } 
    } 

В этом случае при создании объекта MyClass, вы только добавить метод , а не вычесть. Чтобы получить доступ к вычитанию, вам придется использовать ссылочный тип I1

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