C# 类继承和多态字段的多态性

问题描述 投票:0回答:1

我偶尔会遇到类的设计问题,主要是在一些视频游戏中。当扩展另一个类(例如

Player
)的类的字段同时也是具有自己的扩展类的类时,就会出现问题。我知道这是一个模式问题,但不知道如何正确解决它。

让我们举一个超级简单的例子。

  1. 一个名为 Engine 的类,用于驱动
  2. 一个名为 SpecialEngine 的类,需要收费
  3. 名为“带引擎的汽车”的类
  4. 带有 SpecialEngine 的 SpecialCar 类
public class Engine {
  public void Drive() {}
}

public class Engine : SpecialEngine {
  public void Charge() {}
}

public class Car {
  protected Engine engine;
  public virtual void Move(){
    this.engine.Drive();
  }
}

public class SpecialCar : Car {
  // Both SpecialCar.engine and SpecialCar.specialEngine 
  // would need to be set to an instance of SpecialEngine
  private SpecialEngine specialEngine;
  public override void Move(){
    // or.. cast this.engine to SpecialEngine? 
    this.specialEngine.Charge();
    base.Move();
  }
}

Car
有一个
Engine
,你可以将
SpecialEngine
传递给
Car
(不知道 C# 使用术语“切片”,但这至少在 C++ 中有效)。但您无法访问
SpecialEngine
的任何属性。因此,您创建的
SpecialCar
可以接受
SpecialEngine
作为其
engine
,但您想要访问
SpecialEngine
,因此您创建了第二个名为
specialEngine
的字段,现在有两个对其的引用?

我的想法是错误的,我不知道我应该做什么。我知道我可能有一个通用的

Car<T>
但我觉得我最终可能会得到
Car<A, B, C, D...>

c# class inheritance polymorphism
1个回答
0
投票

C# 支持协变返回。只能在

SpecialEngine
中使用单个
SpecialCar

namespace CovariantReturnType
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }

    public class Engine
    {
        public void Drive() { }
    }

    public class SpecialEngine : Engine
    {
        public void Charge() { }
    }

    public class Car
    {
        protected virtual Engine Engine { get; }
        public virtual void Move()
        {
            Engine.Drive();
        }
    }

    public class SpecialCar : Car
    {
        protected override SpecialEngine Engine { get; }
        public override void Move()
        {
            Engine.Charge();
            base.Move();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.