2015-10-09 3 views
1
class Program 
{ 
    interface I1 
    { 
     void F1(); 
    } 

    interface I2 
    { 
     void F2(); 
    } //2 interfaces 

    abstract class b1 : I1 
    { 
     abstract public void F1(); 
    } 

    private class d1 : b1 
    { 
     public override void F1() 
     { 
      Console.Write("Inside D1:b1.F1"); 

      //I want to call my method() here 
      MyMethod(); 
     } 
    } 

    private class d2 : b1 
    { 
     public override void F1() 
     { 
      Console.Write("Inside d2:b1.F1"); 

      //I want to call my method() here 
      MyMethod(); 
     } 
    } 

    private class ImeplementI2_1 : I2 
    { 
     public void F2() 
     { 
      //Implementation 
      Console.Write("Inside b_1:b_1.F2"); 

      //I want to call my method() here 
      MyMethod(); 
     } 
    } 

    private class ImeplementI2_2 : I2 
    { 
     public void F2() 
     { 
      //Implementation 
      Console.Write("Inside b_1:b_1.F2"); 

      //I want to call my method() here 
      MyMethod(); 
     } 
    } 

    void MyMethod() 
    { 
     Console.WriteLine("Printmenow"); 
    } 

    static void Main(string[] args) 
    { 
     I1 interface1; 

     if (args.Length > 0) 
     { 
      interface1 = new d1(); 

     } 
     else 
     { 
      interface1 = new d2(); 
     } 

     interface1.F1(); 
     //I want to call my method() here 
     MyMethod(); 

    } 

} 

Где было бы лучше всего реализовать MyMethod()? У меня два интерфейса имеют один и тот же метод, реализованный по-разному. Поэтому я подумал об этом и, кажется, могу пойти со статическим методом в этой программе класса, чтобы все были счастливы. Любые предложения или лучшие решения?Как создать общие методы между двумя интерфейсами

+0

10 «У меня есть два интерфейса с использованием метода smae по-разному» W гип? –

+0

Похоже, вам нужен абстрактный класс. – kevintjuh93

+0

Почему именно вам это нужно?Пожалуйста, предоставьте более подробную информацию о вашей проблеме, потому что, поскольку на данный момент сложно сказать что-либо – Fabjan

ответ

0

Добавить другой интерфейс в качестве основного интерфейса для этих двух

interface IMyMethodable 
{ 
    void MyMethod(); 
} 

interface I1 : IMyMethodable 
{ 
    void F1(); 
} 

interface I2 : IMyMethodable 
{ 
    void F2(); 
} //2 interfaces 

Если вы хотите получить доступ к MyMethod класса Program вы можете сделать две вещи:

1) просто объявить его как Static

2) передать его в качестве делегата и позвонить в свои классы

+0

Где бы вы его реализовали? Я не хочу реализовывать дважды, так как функциональность этого MyMethod() одинаково потребляет некоторые внешние вызовы библиотеки. ? – anotheruser

+0

Ему не нужны оба интерфейса для * выставлять * 'MyMethod', ему нужны все реализации любого интерфейса для доступа к этому методу. – Servy

0

Правильно ли я понимаю, что в методе d1.F1 вы хотите вызвать метод с именем MyMethod() и в d2.F1 yo u также хотите вызвать тот же метод с именем MyMethod().

Вы не указываете, к какому классу принадлежит MyMethod(), но, по-видимому, это то, что могут вызвать как d1, так и d2. Кроме того, они называют тот же MyMethod. Я думаю, вы должны поместить MyMethod в общий суперкласс d1 и d2, который в вашем случае будет b1.

Вы можете сказать: «Каждый b1 имеет тот же MyMethod() Тогда это, безусловно, принадлежит б1

Рассмотрим класс Shape и его подклассы, как прямоугольник, овал и подразделам подклассов, как квадрат и круг

?. Если вы говорите, что у каждой фигуры есть одна точка, которую мы будем называть позицией Shape, то GetPosition определенно будет функцией Shape.

Однако, хотя каждая фигура имеет область, способ вычисления площади прямоугольник очень отличается от области круга. GetArea() - типичный пример функции, которая wo uld - места в интерфейсе или, может быть, абстрактная функция Shape.

+0

Спасибо, MyMethod() совершенно новый, я должен написать, который будет вызывать кучу других вызовов библиотеки. Infact, я должен реализовать 3 MyMethods. Поэтому я могу создать новый класс или определить внутри него тоже. Но хотите понять, какое лучшее/оптимальное решение здесь – anotheruser

-1

Вы совершенно правы, что если у вас есть определенный метод, который вы написали, что хотите быть доступным из любого данного класса и которому не нужен экземпляр объекта для хранения какого-либо состояния, тогда вы хотите использовать метод public static , В вашем примере было бы работать, чтобы получить его в пределах Program, хотя в любом примере, отличном от игрушки, я настоятельно рекомендую вам не вложить все это в класс Program. Все эти типы должны быть типами верхнего уровня, а MyMethod должен быть статическим методом какого-либо нового типа, который представляет свою ответственность за выполнение такой операции.

1

Любой тип использования базы:

interface IA {} 
interface IB {} 

class Base 
{ 
    protected void MyMethod() {} 
} 

class A : Base, IA {} 
class B : Base, IB {} 

или статический метод (вероятно, из статического класса):

static class MyHelper() 
{ 
    public static void MyMethod() {} 
} 

или сделать какую-то услугу, а также использовать эту услугу, как зависимость (вы можете рассмотреть возможность использования инъекции зависимостей здесь):

interface IMyService 
{ 
    void MyMethod(); 
} 

class MyService : IMyService 
{ 
    public void MyMethod() {} 
} 

class A : Base, IA 
{ 
    private readonly IMyService service; 

    public A(IMyService service) 
    { 
     this.service = service; 
    } 

    // IA implementation 
} 

class B : Base, IB 
{ 
    private readonly IMyService service; 

    public B(IMyService service) 
    { 
     this.service = service; 
    } 

    // IB implementation 
} 
Смежные вопросы