2013-12-14 4 views
1

У меня есть код ниже, какЧто такое абстрактный класс поведения и интерфейс в C#?

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
} 

Теперь компилируется успешно? почему не нужно переопределять метод интерфейса в классе childe?

+1

Вы заметили, что интерфейс определяет метод с именем 'mehtod', но абстрактный класс определяет' метод'? –

+0

Вы пробовали свой отредактированный ответ? Потому что теперь он компилируется без ошибок. Ваша проблема была в том, что написал Джон Сондерс. – Kikaimaru

+1

Вам не нужно реализовывать его снова, потому что у класса childe уже есть метод «метод», реализованный из его родительского Nomi1. Если вы хотите реализовать его другим способом, сделайте метод «метод» в Nomi1 виртуальным и переопределите его в классе childe. – Kikaimaru

ответ

3

Вам нужен explicit implementation интерфейса. Метод абстрактного класса method() реализует необходимость реализации абстрактного метода интерфейса. Поэтому определите метод интерфейса в классе childe, но явной реализации необходимо вызвать метод интерфейса, но не в классе.

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
      Console.WriteLine("abstract class method"); 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
    void NomiInterface.method() 
    { 
      Console.WriteLine("interface method"); 
    } 
} 

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

childe c = new childe(); 
NomiInterface ni = new childe(); 
ni.method(); 
c.method(); 

Выход

interface method 
abstract class method 

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

public interface NomiInterface 
{ 
    void method(); 
} 
public abstract class Nomi1 
{ 
    public void method() 
    { 
     Console.WriteLine("abstract class method"); 
    } 
} 
public class childe : Nomi1, NomiInterface 
{ 
    void method() { Console.WriteLine("interface method"); } 
} 

Создайте объект класса и интерфейса, как мы это делали ранее.

childe c = new childe(); 
NomiInterface ni = new childe(); 
ni.method(); 
c.method(); 

Выход вы получите

abstract class method 
abstract class method 

В качестве дополнительной записке вы будете заботиться о именовании для имен классов/методов. Вы можете найти больше о соглашениях об именах here.

+1

Проблема в том, что у него есть опечатка в интерфейсе __mehtod__. Этот ответ просто запутан. – Kikaimaru

+0

@ Кикаймару - ОП спросил, откуда взялась реализация, абстрактный класс и почему он не переоценивается. Ответ Адиль объясняет это. – Tim

+0

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

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