Передача производных объектов в конструкцию - PullRequest
0 голосов
/ 20 мая 2010

Это немного запутанный вопрос, надеюсь, я смогу его прояснить.

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

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

extUser Удлиняет coreUser
extSecurity Удлиняет coreSecurity

В конструкторе для coreUser у вас есть это:

public coreUser(string id, ref coreSecurity cs)

При попытке продлить coreUser вы получите следующее:

public extUser(string id ref extSecurity es) : base(id, ref es)

Это не удалось, поскольку es имеет тип extSecurity, а базовый класс ожидает тип coreSecurity. Я не нашел в любом случае, чтобы привести это, чтобы позволить мне переопределить этот базовый класс в C #. В VB работает просто отлично.

Как примечание, ради этого вопроса я на 100% не могу вносить изменения в базовые классы.

Идеи

Ответы [ 3 ]

2 голосов
/ 20 мая 2010

Это потому, что аргументы для параметров ref должны иметь точно того же типа, что и параметр, а не только тот, для которого доступно преобразование.

Вам действительно, действительно нужна часть ref? Заставить конструктор принять параметр ref довольно необычно. Вы уверены, что это не просто путаница с механизмами передачи параметров ? Я знаю, что вы сказали, что вы не можете изменить «основные» типы, но вы должны хотя бы взглянуть на их изменение в какой-то момент в будущем, если они действительно не используют эту «ref» функциональность. Если они используют "ref", то имеет смысл, что это недопустимо ... конструктор coreUser может выглядеть так:

public coreUser(string id, ref coreSecurity cs)
{
    coreSecurity = new coreSecurity();
}

Это бы запутало ваш extUser конструктор, не так ли? es будет ссылаться на объект, который не был extSecurity ...

(Наряду с похожими «странными» строками - ваши типы действительно верблюжьими? Соглашения .NET предназначены для типов, которые должны быть PascalCased ...)

Если вы можете действительно только изменить конструктор extUser, то, как говорит Одед, вы можете изменить тип параметра на coreSecurity - и затем, если вам нужно это как extSecurity, вы можете брось это:

public extUser(string id, ref coreSecurity cs) : base(id, ref cs)
{
    extSecurity es = (extSecurity) cs;
    // Use es here
}

Конечно, это вызовет исключение, если cs ссылается на объект, который не является extSecurity к тому времени, когда базовый конструктор вернул ...

0 голосов
/ 20 мая 2010

ref используется для манипулирования типом значения (т. Е. Ссылкой, структурами или целыми числами и т. Д.). Уже одно это показывает огромное неправильное использование конструктора ( Конструктор действительно работает , это Java, но также применимо). Конструкторы предназначены для создания объекта, для которого вам никогда не нужен параметр ref. Я знаю, что это на самом деле не отвечает на ваш вопрос, но ваш код серьезно испорчен.

ключевое слово ref

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

Пример 1: Передача ссылки в int

public class Test
{
  public void TestMethod (ref int input)
  {
    input = 2;
  }
  public void Run()
  {
    int testVar = 1;
    TestMethod(ref testVar);
    //testVar is now 2
  }
}

Пример 2. Передача справочной строки Обычно, если вы передаете строку (или любой другой ссылочный тип) в метод, вы не можете изменить сам объект .

public class Test
{
  public void TestMethod (ref string input)
  {
    input = "changed";
  }
  public void Run()
  {
    string testVar = "original";
    TestMethod(ref testVar);
    //testVar is now "changed"
  }
}

С помощью аргумента ref он позволяет вам изменять сам объект, а не только его поля и свойства. Аргумент ref для referenceType позволяет вам изменять саму ссылку (назначая ей новый объект), а не только содержимое ссылки (см. msdn ).

0 голосов
/ 20 мая 2010

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

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