Используйте фабричный метод для создания базового объекта для унаследованного класса

У меня есть класс примерно так:

public class User {
  public User() {
    // this constructor creates an object representing a brand new user
  }

  public static User Get(MyDbObject dbObject) {
    // this factory method creates an object representing an existing user, from a database object
  }
}

и унаследованный класс, например:

public class ExtendedUser : User {
  public object ExtendedProperty { get; set; }

  public static ExtendedUser Get(MyDbObject dbObj) {
    User usr = User.Get(dbObj);
    this = usr; // this does NOT work
    this.ExtendedProperty = "just an example";
  }
}

Первоначально все это работало с использованием перегруженных конструкторов, которые создавали объект из записи MyDbObject, поэтому у ExtendedUser был такой конструктор:

public ExtendedUser(MyDbObject dbObj) : base(dbObj) {
  this.ExtendedProperty = "another example, this is how it WAS working";
}

Я хочу отказаться от использования конструкторов для создания этих объектов в пользу фабричных методов, но я не думаю о том, как назначить базовый экземпляр / объект без вызова конструктора. Это возможно?


person DaveD    schedule 06.03.2014    source источник
comment
Нет, это невозможно.   -  person MarcinJuraszek    schedule 06.03.2014
comment
Почему вы хотите использовать фабричные методы вместо конструкторов?   -  person khellang    schedule 06.03.2014


Ответы (1)


Фабричные методы знают, как создавать определенные экземпляры класса, обычно не базового класса. Вместо этого вы можете иметь для этой цели защищенный конструктор в базовом классе:

    public class User {
      public User() {
        // this constructor creates an object representing a brand new user
      }

      protected User(MyDbObject dbObject) {
        // creates an object representing an existing user, from a database object
      }

      public static User GetUser(MyDbObject dbObject) {
        return User(dbObject);
      }
    }

    public class ExtendedUser : User {
      public object ExtendedProperty { get; set; }

      private ExtendedUser(MyDbObject dbObject) : base(dbObject)
      {
        //add extra data onto the base class here
      }

      public static ExtendedUser GetExtendedUser(MyDbObject dbObj) {
        return new ExtendedUser(dbObject);
      }
    }
person CD Waddell    schedule 06.03.2014
comment
Ага, отлично. Спасибо! - person DaveD; 06.03.2014
comment
Случайно сделал базовый класс и унаследованный класс одним и тем же статическим методом ... Я исправил это в правке. - person CD Waddell; 06.03.2014