Это может звучать как дамп, но могу ли я сделать следующее:

public class CameraConnection
{
    Object camera;
    public CameraConnection(bool isNewCamera)
    {
        if(isNewCamera)
        {
            camera = new Camera1();
            
        }
        else
        {
            camera = new Camera2();
        }
    }
    public void TakeImage()
    {
        camera.TakeImage();
    }
}

Итак, здесь я могу вызвать camera.TakeImage() для получения изображения, но в зависимости от того, какой класс создает экземпляр переменной камеры (Camera1 или Camera2), он фактически использует API-интерфейсы разных камер.

Я чувствую, что это несколько связано с абстракцией класса или интерфейсом, но не совсем уверен...

Большое спасибо!

c#
0
Liangze Lu 4 Фев 2022 в 03:51
2
У вас должен быть базовый класс и использовать его вместо «объекта»
 – 
pm100
4 Фев 2022 в 03:53
dynamic camera;
 – 
Hans Passant
4 Фев 2022 в 03:54
Это классический базовый класс или дизайн интерфейса. динамический - не лучший ответ
 – 
pm100
4 Фев 2022 в 03:56
Если вы в конечном итоге используете решение ICamera (вы отметили его как правильное, поэтому я так предполагаю), и вы обнаружите, что повторяете вещи между обоими классами, то это означает, что вам нужна базовая/производная структура, как в другом ответе, общий код идет в базе, различия в производных классах
 – 
pm100
4 Фев 2022 в 04:21

2 ответа

Лучший ответ

Определить интерфейс, который определяет поведение камеры.

public interface ICamera{
  void TakePhoto();
  int HowManyPicsInCamera();
  .....
  // all the things a camera object needs to do
}

Теперь есть несколько классов, которые его реализуют

public class Camera1:ICamera{
    void TakeShot(){
    }
     int HowManyPicsInCamera(){
    }
}


public class Camera2:ICamera{
    void TakeShot(){
    }
     int HowManyPicsInCamera(){
    }
}

Теперь используйте это

public class CameraConnection
{
    ICamera camera;
    public CameraConnection(bool isNewCamera)
    {
        if(isNewCamera)
        {
            camera = new Camera1();
            
        }
        else
        {
            camera = new Camera2();
        }
    }
    public void TakeImage()
    {
        camera.TakeImage();
    }
}

В качестве альтернативы вы можете использовать базовый класс, вы делаете это, если есть общие детали реализации. Как общие данные или код.

3
pm100 4 Фев 2022 в 04:00

Это связано с абстракцией классов, а точнее с наследованием.

Например:

public class BaseCamera {}

public class Camera1 : BaseCamera {}

public class Camera2 : BaseCamera {}

Это позволит вам создавать экземпляры нескольких типов камер на основе родительского класса. Я рекомендую удалить object как тип, потому что, например, компилятор не сможет разрешить camera.TakeImage().

0
beautifulcoder 4 Фев 2022 в 04:03