CS2011 Ответов: 2

Какой подход к проектированию лучше всего подходит для такого рода проблем


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

"У меня есть список продуктов, скажем, A, B, C, D. A имеет 3 свойства с именем x,y и z и 1 функцию F1. продукт B имеет 4 Свойства с именем x,y,z и p и 2 функции с именем F1 и F2 и так далее для продукта C также имеет 4 Свойства с именем x,y,z и p и 2 функции с именем F1 и F3. а продукт D имеет 4 Свойства с именем x,y, z и p и 2 функции с именем F1 и F4.



Теперь из-за этого я не могу иметь общий интерфейс или абстрактные классы, потому что класс B имеет одну дополнительную функцию, а C и D имеют одну функцию, которая отличается от B и которая является общей.


Есть ли какое-либо возможное решение, с помощью которого я могу избежать этого ? Любое предложение будет высоко оценено.

Что я уже пробовал:

Я думал о том, чтобы иметь код мошенника в одном абстрактном классе, а не создавать конкретный класс с дополнительной функцией, которая содержит абстрактный класс (как зависимость). Но в таком случае мой клиент будет вынужден зависеть от конкретного класса.

2 Ответов

Рейтинг:
2

RickZeeland

Может быть, вы можете использовать Словарь аналогично этому в ответе на этот вопрос StackOverflow: отражение-C# с использованием активатора.Свойство - Переполнение Стека [^]


Рейтинг:
0

pt1401

Если я правильно читаю паттерн в классах, разве не подойдет что-то такое простое, как это?
Или вы можете даже поместить p в отдельный интерфейс и наследовать его в B, C, D...

public interface IA
{
    int x { get; set; }
    int y { get; set; }
    int z { get; set; }
    int F1();
}

public interface IB
{
    int p { get; set; }
    int F2();
}

public interface IC
{
    int p { get; set; }
    int F3();
}

public interface ID
{
    int p { get; set; }
    int F4();
}

public class A : IA
{
    public int x { get; set; }
    public int y { get; set; }
    public int z { get; set; }

    public int F1()
    {
        return 0;
    }
}
public class B : IA, IB
{
    public int x { get; set; }
    public int y { get; set; }
    public int z { get; set; }
    public int p { get; set; }

    public int F1()
    {
        return 0;
    }
    public int F2()
    {
        return 0;
    }
}

public class C : IA, IC
{
    public int x { get; set; }
    public int y { get; set; }
    public int z { get; set; }
    public int p { get; set; }

    public int F1()
    {
        return 0;
    }
    public int F3()
    {
        return 0;
    }
}

public class D : IA, ID
{
    public int x { get; set; }
    public int y { get; set; }
    public int z { get; set; }
    public int p { get; set; }

    public int F1()
    {
        return 0;
    }
    public int F4()
    {
        return 0;
    }
}


CS2011

как бы вы создали экземпляр в этом случае? предположим, вам нужно создать экземпляр D. Что бы вы использовали ? если ваш клиент использует IA, то F4 будет недоступен, а в случае ID F1, F2 и F3 будут недоступны.

pt1401

Зависит от того, нужно ли его вводить.
Если нет, то это сработает (и имеет то преимущество, что оно ошеломляюще просто).
Иногда самый простой способ лучше.

var myD = новый D();

CS2011

Ну, я хотел избежать использования конкретного класса при создании объекта, и это разрушит всю цель постановки вопроса.

pt1401

Если вам действительно нужно создать из интерфейса, возможно, потому, что вы хотите внедрить его, вы можете создать составные интерфейсы, а затем создать D с помощью идентификатора интерфейса

идентификатор публичного интерфейса : IA
{
int p { get; set; }
int F4();

}
открытый класс Д : ИД
{
}