У меня есть куча данных, которые я хочу создать в классе, и для каждой переменной я хочу обеспечить определенный набор методов. IE:Дизайн класса C# без использования «внутреннего» или «статического»?
[TypeA] VarA
[TypeB] VarB
[TypeC] VarC
FA1() which is a function of VarA and VarB
FA2() which is a function of VarA and VarC
FB1() which is a function of VarB and VarA
FB2() which is a function of VarB and VarC
...
Как будет большое количество переменных (и, следовательно, еще больше функций) Я хочу, чтобы разделить свой исходный код на управляемые куски. Поэтому я ищу автоматический способ гарантировать, что все функции для каждой переменной будут созданы.
У меня есть 3 возможных метода для организации моего кода, и я не очень доволен каждым из них, и я ищу или совет относительно того, какой метод лучше (или даже если я пропустил совершенно другую реализацию метод):
1. Частичный класс
partial class Base
{
}
partial class Base
{
[TypeA] VarA;
FA1 { .. }; // function of VarA and VarB
FA2 { .. }; // function of VarA and VarC
}
partial class Base
{
[TypeB] VarB;
FB1 { .. }; // function of VarB and VarA
FB2 { .. }; // function of VarB and VarC
}
Pros:
- Простой
- Переменные могут быть доступны только из класса Base.
- Если есть две переменные того же типа, то функции для каждой переменной могут выполнять свою собственную функцию по-разному.
Минусы:
- не может автоматически обеспечить, чтобы все функции созданы для каждой переменной
- Необходимо вручную убедиться, что нет имен столкновений между каждым именем функции.
Обратите внимание, что Cons может быть решена с помощью генератора кода какой-то (может быть время, чтобы узнать T4 ??)
2. Внутренний класс
class Base
{
internal [ClassA] ObjA = new [ClassA]();
internal [ClassB] ObjB = new [ClassB]();
}
class [BaseClassA]
{
public [TypeA] VarA;
public virtual F1 { .. };
public virtual F2 { .. };
}
class [ClassA] : [BassClassA]
{
public override F1 { .. }; // function of VarA and ObjB.VarB
public override F2 { .. }; // function of VarA and ObjC.VarC
}
...
Pros :
- Иерархия классов предусматривает, что al l создаются и доступны переменные.
- Благодаря использованию виртуальных функций можно создавать экземпляра конкретных реализаций функций
Минусы:
- Использование внутреннего означает, что данные видны везде в сборке.
3.Статические данные
abstract class Data
{
static [TypeA] VarA;
static [TypeB] VarB;
...
}
abstract class [BaseClassA] : Data
{
public virtual F1 { .. };
public virtual F2 { .. };
}
class [ClassA] : [BassClassA]
{
public override F1 { .. }; // function of VarA and VarB
public override F2 { .. }; // function of VarA and VarC
}
class Base
{
[ClassA] ObjA = new [ClassA]();
[ClassB] ObjB = new [ClassB]();
}
Плюсы:
- Система гарантирует, что все процедуры инстанцируются
- Данные не взорвали все вокруг узла
- Внутри каждой функции вы можете напрямую ссылаться на другие переменные на решение «частичного класса»
Против:
- Использование статического пахнет я только переизобрел глобальные данные.
То, что я хочу, чтобы как-то вишневый выбрать лучшие моменты каждого метода:
- Прямой способ доступа к переменным «Частичного класса» и «Статические» методы
- Локальные данные метода «Partial class»
- Автоматическое внедрение функции «Внутренние» и «Статические» методы.
И я хочу, чтобы избежать:
- Отсутствие исполнившего генерации функции в «Частичный класс»
- глобальный доступ к данным в «Internal» метод
- повторно изобретение глобальных данных в методе «Статический»
Если бы у меня были мои барабанщики, я бы сказал, что я хочу, чтобы как-то применить интерфейс к instan в.п. переменного - как:
[TypeA] VarA : IFunctions;
[TypeB] VarB : IFunctions;
И как-то компилятор автоматически генерирует конечные имена функций из имен интерфейсов и vaiable имени.
Таким образом, люди могут предложить, какой из 3 методов они предпочли бы реализовать, или предложить любые другие методы, которые могут подойти.
ow. мозг больно. как формируются данные. – Will