2008-12-29 2 views
1

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

MyNamespace.Cars car = null; 

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

car.Drive(40); 

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

+0

Надеюсь, вы не ожидаете, что обе машины будут управляться на основе этого уникального автомобиля. Имена переменных должны быть разными для вашей Honda и Toyota – Bob

+0

ok Я изменил код, чтобы сделать его более точным. – Blankman

ответ

10
Interface Car 
{ 
void Drive(int miles); 
} 

class Honda : Car 
{ 
... 
} 
class Toyota : Car 
{ 
... 
} 
+0

Ты избил меня. Я удалю шахту –

+0

, которая должна быть интерфейсом ICar – foson

+0

Эй, человек, не нужно - это не соревнование :) –

1

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

6

Вы могли бы сделать это несколькими разными способами. Вы можете объявить абстрактный базовый класс, или у вас может быть интерфейс, реализуемый вашим объектом. Я считаю, что предпочтительным методом «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 
} 
0
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) { ... } 
    } 
} 
+0

Я изменил свой код, ваше решение все еще точным? – Blankman

+0

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

0

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

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

сделать абстрактный класс автомобилей с абстрактным методом, который называется Drive (). Подклассируем его и добавим реализации.

5

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

Я позе что-то другое:

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

EDIT: Вот ссылка с MSDN - http://msdn.microsoft.com/en-us/library/ms954600.aspx

EDIT: Смотрите комментарии к другой ссылке.

+0

Основываясь на изменениях в его вопросе, я думаю, что ваш ответ лучше всего подходит сейчас. –

+0

Публикация примера была бы действительно полезна, потому что он, вероятно, раньше не занимался фабриками. – strager

+0

http://www.dofactory.com/Patterns/PatternAbstract.aspx для абстрактного заводского примера. –

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