#c -cli
#c -cli
Вопрос:
C /CLI :
public interface class ITest{
public:
virtual void doSomething (){
}
}
public ref Base {
...........
...........
}
generic <typename T> where T : ITest
public ref Derived : Base{
public:
virtual void doNothing (){
}
}
public ref AnotherClass {
public:
generic<class T> where T : Base
static int justDoThis(){
//Problem!!
}
}
C# :
В C # есть два класса A
и B
. A
наследуется от ITest
и B
наследуется от Derived
того, где A
используется в качестве имени типа. Кроме того, B
имеет закрытую переменную типа A
. Итак, вызывается функция from main AnotherClass.justDoThis<B>()
, где B
передается как универсальный тип.
«// Проблема !!» Часть :
Теперь мне нужно создать новый экземпляр B
в этом разделе, а также получить доступ к A
закрытой переменной B
.
Ответ №1:
Итак, если я возьму ваш абзац описания кода C #:
class A : ITest {}
class B : Derived<A>
{
private A someVariableOfTypeA;
}
class Program
{
void Main(string[] args)
{
AnotherClass.justDoThis<B>();
}
}
И проблема в том, что вы хотите это сделать:
public ref AnotherClass {
public:
generic<class T> where T : Base
static int justDoThis()
{
// Problem!!
Something^ actuallyB = gcnew Something();
A^ a = actuallyB->someVariableOfTypeA;
}
}
Проблема № 1. Вы можете разрешить создание новых объектов универсального типа, указав gcnew
в качестве другого общего ограничения. (В C # это было бы new
.) Для этого потребуется, чтобы у универсального типа был конструктор по умолчанию (т. Е. Без параметров), к Которому вы можете получить доступ с помощью обычного gcnew
.
generic<class T> where T : Base, gcnew
static int justDoThis()
{
T^ t = gcnew T();
}
Проблема № 2: вы не можете получить доступ к закрытым переменным внутри объекта. Вот что значит private . Если вы хотите предоставить justDoThis
доступ к A
объекту, добавьте соответствующий общедоступный метод или свойство Base
. Метод или свойство будут возвращать тип ITest
. Вы также можете поместить этот метод / свойство в новый интерфейс (возможно, с именем IHaveAnITestAccessorMethod
) и добавить его в качестве другого общего ограничения, которое B
удовлетворяет всем ограничениям.
Обратите внимание, что не принесет никакой пользы, если сделать переменную общедоступной для type B
: justDoThis
не знает о B
, он знает только о T
, который является Base
конструктором без параметров.
Отказ от ответственности:
- Я не проверял свой синтаксис с помощью компилятора.
- Да, вы можете делать что угодно с отражением, но это плохой дизайн. Не делайте этого, исправьте свой код правильным образом.
Комментарии:
1. Привет, я новичок в C / CLI. Спасибо за ваш ответ, но проблема 1 невозможна. Как показывает ошибка при сборке: невозможно использовать gcnew для выделения универсального типа. Я использую safe_cast <TService>(System::Activator::CreateInstance (TService::typeid)). Теперь я хочу сделать 2 вещи. Сначала передайте это значение другой универсальной функции без предложения where. Во-вторых, внутри этой другой функции я хочу использовать функцию переопределения, которая записана в from ITest
2. Что такое
TService
?TService
В вашем вопросе нет a . Кроме того, пожалуйста, задавайте по одному вопросу за сообщение, не добавляйте больше вопросов к одному и тому же сообщению.3. Это T. Извините. Я дал неправильное имя универсального типа. Не могли бы вы, пожалуйста, ответить на вопрос. Мне нужен ответ. 🙂