Какова концепция создания экземпляра класса с использованием имени интерфейса?

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

Только мне нужно больше пояснений, как называется этот процесс или какие детали делает .Net, когда я объявляю этот тип объекта.

IDataReader oSQLReader = new SqlDataReader();
IDataReader oOLEReader = new OleDbDataReader();

person Khaled Questions    schedule 20.06.2013    source источник
comment
Попробуйте найти Полиморфизм   -  person Jens Kloster    schedule 20.06.2013
comment
это базовая практика объектно-ориентированного программирования, вы будете писать методы, которые используют только тип интерфейса в качестве формальных параметров и не заботятся о конкретном объекте, передаваемом в качестве фактических параметров. Причина этого в том, что если позже вы решите использовать другой конкретный класс, например, OracleDataReader, вам не нужно будет ничего менять в методах или коде, которые имеют дело только с IDataReader.   -  person Davide Piras    schedule 20.06.2013
comment
спасибо всем за ответ, да, я знаю, что это полиморфизм, но как мы назвали этот шаг?   -  person Khaled Questions    schedule 20.06.2013
comment
Я имею в виду, когда я делаю SqlDataReader oSqlDataReader = new SqlDataReader(), мы говорим, что создаем новый объект типа SqlDataReader, когда мы делаем IDataReader oSqlDataReader = new SqlDataReader(); мы не можем сказать, что создаем объект типа IDataReader... @Davide Piras   -  person Khaled Questions    schedule 20.06.2013


Ответы (3)


Что именно происходит, так это то, что вы создаете экземпляр определенного класса, а затем преобразуете ссылку на тип интерфейса.

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

Фактический тип объекта по-прежнему является типом экземпляра, который вы создали, поэтому вы можете снова преобразовать ссылку на этот тип:

SqlDataReader reader = (SqlDataReader)oSQLReader;
person Guffa    schedule 20.06.2013
comment
Из этого ответа я понимаю, что если у нас есть интерфейс, содержащий два метода GetName(); и ПолучитьID(); и у нас есть класс, реализующий этот интерфейс, и еще один метод с именем GetGender(); если мы создадим объект, используя методологию восходящего приведения, мы сможем получить доступ только к методу, который подразумевает использование интерфейса.. это правильно? @Guffa, спасибо за ответ, и я попробую сейчас на примере :) - person Khaled Questions; 20.06.2013
comment
@KhaledQuestions: Да, это правильно. Чтобы получить доступ к членам, которые существуют в классе, но не в интерфейсе, вам необходимо понизить ссылку (или привести ее к другому интерфейсу, который также реализует класс и который определяет этот член). - person Guffa; 20.06.2013

концепция проста:

public class Cat : IAnimal {
     public void Voice() {//implements IAnimal's method
         Console.WriteLine("Miyaoo");
     }
}

public class Dog: IAnimal {
     public void Voice() {  //implements IAnimal's method
         Console.WriteLine("Woof");
     }
}

public interface IAnimal {
      public void Voice();
}

после инициализации

IAnimal animal1 = new Cat(); 
IAnimal animal2 = new Dog(); 

и где-то в коде

public void MakeAnimalSound(IAnimal animal) {
   animal.Voice(); 
}

поэтому вы можете сделать что-то вроде этого:

MakeAnimalSound(animal1); //prints "Mew" even if type is IAnimal
MakeAnimalSound(animal2); //prints "Woof" even if type is IAnimal

Это полиморфизм.

person Tigran    schedule 20.06.2013

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

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

Я считаю, что это достигается с помощью шаблонов проектирования ОО.

person mmssaann    schedule 20.06.2013