Как мне реализовать такую ​​структуру ООП? - PullRequest
1 голос
/ 30 декабря 2008

Я хочу создать хороший API (C #), чтобы людям было проще его использовать, я думаю, что видел это раньше и хочу знать, как это сделать:

MyNamespace.Cars car = null;

if(someTestCondition)
       car = new Honda();
else    
       car = new Toyota();

car.Drive(40);

Возможно ли это? Если так, что нужно сделать?

Ответы [ 7 ]

10 голосов
/ 30 декабря 2008
Interface Car
{
void Drive(int miles);
}

class Honda : Car
{
...
}
class Toyota : Car
{
...
}
6 голосов
/ 30 декабря 2008

Вы можете сделать это несколькими способами. Вы можете объявить абстрактный базовый класс или иметь интерфейс, который реализует ваш объект. Я полагаю, что предпочтительный метод "C #" будет иметь интерфейс. Что-то вроде:

public interface ICar
{
    public Color Color { get; set; }

    void Drive(int speed);
    void Stop();

}

public class Honda : ICar
{

    #region ICar Members

    public Color Color { get; set; }

    public void Drive(int speed)
    {
        throw new NotImplementedException();
    }

    public void Stop()
    {
        throw new NotImplementedException();
    }

    #endregion
}

public class Toyota : ICar
{
    #region ICar Members

    public Color Color { get; set; }

    public void Drive(int speed)
    {
        throw new NotImplementedException();
    }

    public void Stop()
    {
        throw new NotImplementedException();
    }

    #endregion
}
5 голосов
/ 30 декабря 2008

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

Я поставлю кое-что еще:

Вы захотите создать «CarFactory», который будет возвращать конкретную реализацию вашего базового класса / интерфейса. Метод Create может принять ваши условия тестирования в качестве параметров, чтобы вы создали правильный автомобиль.

РЕДАКТИРОВАТЬ: Вот ссылка из MSDN - http://msdn.microsoft.com/en-us/library/ms954600.aspx

РЕДАКТИРОВАТЬ: см. Комментарии для другой ссылки.

1 голос
/ 30 декабря 2008

Создайте класс с именем Cars. Дайте ему метод Drive. Расширьте этот базовый класс в классах Honda и Toyota.

0 голосов
/ 30 декабря 2008

Создайте абстрактный класс Cars с абстрактным методом Drive (). Подкласс это и добавить реализации.

0 голосов
/ 30 декабря 2008

Не забудьте про пространство имен, также смотрите мой комментарий в вопросе об именах переменных

namespace MyNamespace {
    public interface Cars {
        void Drive(int speed);
    }

    public class Honda : Cars {
        public void Drive(int speed) { 
        }
    }
    public class Toyota : Cars {
        public void Drive(int speed) {

        }
    }
}
0 голосов
/ 30 декабря 2008
namespace MyNameSpace
{
  public interface Cars
  {
    public void Drive(int miles);
  }
  public class Honda : Cars
  {
    public void Drive(int miles) { ... }
  }
  public class Toyota : Cars
  {
    public void Drive(int miles) { ... }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...