2015-09-04 1 views
1

Я путаюсь с этим сценарием абстрактного класса и интерфейса с таким же сигнатурным методом. Сколько определений будет в выводе класса? Как будет разрешен вызов?tclass расширяет абстрактный класс и реализует интерфейс с тем же методом подписи

public abstract class AbClass 
{ 
    public abstract void printMyName(); 
} 

internal interface Iinterface 
{ 
    void printMyName(); 
} 

public class MainClass : AbClass, Iinterface 
{ 
    //how this methods will be implemented here??? 
} 
+0

Вы должны использовать явный метод переопределения. Максимально допустимы только два определения. Например: 1-й метод. 'AbClass.printMyName() {console.writeln (" Я - AbClass ")};'. 2nd Method: 'Iinterface.printMyName() {console.writeln (" I'm Iinterface ")};' –

ответ

4

Там будет только одна реализация в сценарии по умолчанию, но вы можете иметь два реализации, если вы определите метод с void Iinterface.printMyName подписью. Взгляните на вопрос о Difference between Implicit and Explicit implementations. Также у вас есть какая-то ошибка в образце

  • printMyName в AbClass не помечен как абстрактные, поэтому должен иметь тело.
  • , если вы хотите иметь abstract method - это не может быть частным

-

public abstract class AbClass 
{ 
    public abstract void printMyName(); 
} 

internal interface Iinterface 
{ 
    void printMyName(); 
} 

public class MainClass : AbClass, Iinterface 
{ 
    //how this methods will be implemented here??? 
    public override void printMyName() 
    { 
     Console.WriteLine("Abstract class implementation"); 
    } 

    //You can implement interface method using next signature 
    void Iinterface.printMyName() 
    { 
     Console.WriteLine("Interface implementation"); 
    } 
} 

public class MainClass_WithoutExplicityImplementation : AbClass, Iinterface 
{ 
    //how this methods will be implemented here??? 
    public override void printMyName() 
    { 
     Console.WriteLine("Abstract class and interface implementation"); 
    } 
} 

Пример использования

var mainInstance = new MainClass(); 
mainInstance.printMyName();  //Abstract class implementation 
Iinterface viaInterface = mainInstance; 
viaInterface.printMyName();  //Interface implementation 


var mainInstance2 = new MainClass_WithoutExplicityImplementation(); 
mainInstance2.printMyName();  //Abstract class and interface implementation 
Iinterface viaInterface = mainInstance2; 
viaInterface.printMyName();  //Abstract class and interface implementation 
0

Вы можете ommit реализацию интерфейса в вашей конкретный класс, поскольку базовый класс уже реализует его. Однако вы также можете реализовать интерфейс, явно означающий, что вы можете «переопределить» поведение из вашего базового (абстрактного) класса (переопределение здесь не является правильным здесь). Это еще ожидает, чтобы отдать свой экземпляр explicitky к интерфейсу вызвать этот метод:

public class MainClass : AbClass, Iinterface 
{ 
    //how this methods will be implemented here??? 
    void Iinterface.printMyName() 
    { 
     throw new NotImplementedException(); 
    } 
} 

Вы можете назвать это CIA ((Iinterface(myMainClassInstance).printMyName(). Если вы вызываете myMainClassInstance.printMyName, однако вызывается базовая реализация.

Если вы хотите поддерживать базовую реализацию в базовом классе, вы можете, однако, сделать метод virtual и переопределить его в своем производном классе.

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