Я могу вызвать перегруженного конструктора от другого конструктора того же класса в C#?

У Laravel есть собственное соглашение об именах. Например, если ваша модель называется User.php, то Laravel ожидает, что класс «Пользователь» будет внутри этого файла. Также ожидается users таблица для User модели. Однако вы можете переопределить это соглашение, определив свойство таблицы в вашей модели, например,

    class User extends Eloquent implements UserInterface, RemindableInterface {
        protected $table = 'user';
    }

Из официальной документации Laravel:

Обратите внимание, что мы не сообщили Eloquent, какую таблицу использовать для нашей модели пользователя. Имя класса в нижнем регистре во множественном числе будет использоваться в качестве имени таблицы, если явно не указано другое имя. Таким образом, в этом случае Eloquent будет предполагать, что модель User хранит записи в таблице users. Вы можете указать пользовательскую таблицу, определив свойство $table в вашей модели

Если вы будете использовать идентификатор пользовательской таблицы в другой таблице в качестве внешнего ключа, то это должен быть случай со змеей, подобный user_id, так что он может быть использован автоматически в случае отношения. Опять же, вы можете переопределить это соглашение, указав дополнительные аргументы в функции отношений. Например,

    class User extends Eloquent implements UserInterface, RemindableInterface {
        public function post(){
            return $this->hasMany('Post', 'userId', 'id');
        }
    }

    class Post extends Eloquent{
        public function user(){
            return $this->belongsTo('User', 'userId', 'id');
        }   
    }

Документы для красноречивых отношений Laravel

Для других столбцов в таблице вы можете называть их как хотите.

Я предлагаю вам один раз просмотреть документацию.

192
задан Tomáš Zato 3 April 2014 в 06:51
поделиться

4 ответа

Нет, вы не можете этого сделать, единственное место, где вы можете вызвать конструктор из другого конструктора в C #, - это сразу после ":" после конструктора. например

class foo
{
    public foo(){}
    public foo(string s ) { }
    public foo (string s1, string s2) : this(s1) {....}

}
224
ответ дан 23 November 2019 в 05:31
поделиться

Если вы имеете в виду, можете ли вы выполнять цепочку ctor на C #, ответ - да. Вопрос уже задан.

Однако, судя по комментариям, вы действительно собираетесь спросить «Могу ли я вызвать перегруженный конструктор из внутри другого конструктора с предварительной / постобработкой?»
Хотя в C # нет синтаксиса для этого, вы можете сделать это с помощью общей функции инициализации (как в C ++, который не поддерживает цепочку ctor)

class A
{
  //ctor chaining
  public A() : this(0)
  {  
      Console.WriteLine("default ctor"); 
  }

  public A(int i)
  {  
      Init(i); 
  }

  // what you want
  public A(string s)
  {  
      Console.WriteLine("string ctor overload" );
      Console.WriteLine("pre-processing" );
      Init(Int32.Parse(s));
      Console.WriteLine("post-processing" );
  }

   private void Init(int i)
   {
      Console.WriteLine("int ctor {0}", i);
   }
}
81
ответ дан 23 November 2019 в 05:31
поделиться

РЕДАКТИРОВАТЬ: Согласно комментариям к исходному сообщению, это вопрос C #.

Краткий ответ: да, с использованием ключевого слова this .

Длинный ответ : да, используя ключевое слово this , и вот пример.

class MyClass
{
   private object someData;

   public MyClass(object data)
   {
      this.someData = data;
   }

   public MyClass() : this(new object())
   {
      // Calls the previous constructor with a new object, 
      // setting someData to that object
   }
}
37
ответ дан 23 November 2019 в 05:31
поделиться

В C # невозможно вызвать другой конструктор из тела метода. Вы можете вызвать базовый конструктор следующим образом: foo (args): base (), как указали сами. Вы также можете вызвать другой конструктор в том же классе: foo (args): this ().

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

4
ответ дан 23 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: