Как использовать метод, созданный в дочернем классе (не реализованный в интерфейсе) | C # .NET - PullRequest
0 голосов
/ 05 июня 2019

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

Как я мог это сделать? Это то, что у меня есть

Интерфейс:

interface IShape
{
    double GetPerimeter();
    double GetArea();
}

Классы:

public class Square : IShape
{
     public double  GetPerimeter()
     {
         // all code here
     }

     public double GetArea()
     {
         // all code here
     }
}

public class Rectangle : IShape
{
     public double  GetPerimeter()
     {
         // all code here
     }

     public double GetArea()
     {
         // all code here
     }

     public string PrintShape()
     {
         return "This is a rectangle!"
     }
}

Основная программа:

IShape shape = null;
Console.WriteLine("Select Shape");
Console.WriteLine("1- Rectangle");
Console.WriteLine("2- Square");
int shapeSelected = int.Parse(Console.ReadLine());

if (shapeSelected.Equals(1))
{
     shape = new Rectangle();
}
else
{
     shape = new Square();
}

если я попытаюсь вызвать метод «PrintShape» из класса Rectangle, я не могу этого сделать, как я могу использовать методы, которые не из интерфейса?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

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

Теперь к вашей проблеме. Поскольку IShape не знает метод PrintShape, если вы определите, пытаетесь ли вы вызвать shape.PrintShape(), он не будет компилироваться по причине, указанной выше.

Как вы можете решить это? У вас есть 2 варианта, 1 из которых - навести вашу фигуру, как это ((Rectangle)shape).PrintShape() или то, что я рекомендую вам сделать на самом деле, дать подпись интерфейсу и реализовать ее как пустую в квадрате

1 голос
/ 05 июня 2019

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

var text = ((Rectangle)shape).PrintShape();

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

var rectangle = shape as Rectangle;
if (rectangle != null)
    var text = rectangle.PrintShape();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...