Производный тип, основанный на свойстве базового класса - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть базовый класс и несколько производных классов:

public class Item
{
    public (int itemId, string itemName)
    {
        ItemId = itemId;
        ItemName = itemName;
    }    
    public int ItemId { get; set; }
    public string ItemName { get; set; }
}

public class Weapon : Item
{
    public Weapon(int itemId, string itemName) : base(itemId, itemName) 
    {
        if(itemId != 1) throw InvalidObjectType;
    }
    //custom properties
}

public class Armor : Item
{
    public Armor(int itemId, string itemName) : base(itemId, itemName) 
    {
        if(itemId != 2) throw InvalidObjectType;
    }
    //custom properties
}
//etc

Проблема в том, что у меня есть базовый класс, и базовый класс может быть создан, но в зависимости от typeId я хочу форсировать определенный класс. Так скажем, в конструкторе A если typeId = 0 принять базовый класс, иначе throw. Если typeId = 1, вы должны быть классом B, иначе бросьте; Это хороший подход? Я хочу этого, потому что тип исходит из базы данных, поэтому я могу создать правильный экземпляр на основе этого (конечно, это будет сделано с помощью оператора if), но я хочу убедиться, что код обеспечивает соблюдение этого бизнес-правила. Я хорошо подхожу к этому? Или как я могу это сделать. Я использую C # с EF Core (можно ли установить это правило в конфигурации модели ????)

EDIT:

Category(categoryId, category)
Item (id, name, categoryId, etc)
Weapon (itemId, dmg, maxenhancelevel, etc)

Таким образом, в зависимости от категории возвращаемого элемента, я создаю производный класс или базовый класс (зависит).

Найдите ответ о том, как сопоставить это с EF Core: https://weblogs.thinktecture.com/pawel/2018/05/entity-framework-core-inheritance-tpt-is-not-supported-is-it-part-1-code-first.html

1 Ответ

0 голосов
/ 09 ноября 2018

Один из подходов состоит в том, чтобы поместить все ваши классы в отдельный проект и использовать модификатор internal для конструкторов, чтобы обеспечить их генерацию:

public class BaseClass
{
  internal BaseClass() { }
}
public class Class1:BaseClass
{
  internal Class1() : base() { }
}

public class Class2 : BaseClass
{
  internal Class2() : base() { }
}

Затем в этом же проекте создайте статический метод фабрики для возврата правильного класса:

public static BaseClass ClassFactory(int typeId)
{
  switch(typeId)
  {
    case 0:
      return new BaseClass();
    case 1:
      return new Class1();
    case 2:
      return new Class2();
    default:
      throw new ArgumentException("Unrecoginzed typeId");
  }
}

Используя internal, вы предотвращаете создание этих классов вне проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...