이것은 이전 답변에 대한 의견으로 의도되었지만 시간이 너무 오래 걸렸을 것으로 생각됩니다.
부모 클래스의 인스턴스를 가져와 그 클래스의 데이터를 복사하는 생성자가있는 하위 클래스를 갖는 것이 널리 보급 된 표준입니다. 여러 수준의 상속 및 다른 클래스로 인해 발생할 수있는 두통을 최소화하는 한 가지 방법은이 작업을 수행하는 보호 된 함수를 만드는 것입니다.이 경우에는 Assign이라고 부릅니다. Person
, Employee
및 Manager
이라는 세 가지 클래스가 있다고 가정합니다. 그들은 각각 순서대로 다른 것을 상속 받는다. 그래서 우리는을 변경할 수
public class Manager : Person
{
private string department;
public Manager() { }
public Manager(Employee newManager) : this()
{
base.Assign(newManager);
}
public string Department
{
get { return department; }
set { department = value; }
}
protected new void Assign(Manager otherManager)
{
base.Assign(otherManager);
Department = otherManager.Department;
}
}
그래서 각 클래스에서 Assign()
방법은 new
을 선언
public class Employee : Person
{
private int employeeID;
public Employee() { }
public Employee(Person newEmployee) : this()
{
base.Assign(newEmployee);
}
public int EmployeeID
{
get { return employeeID; }
set { employeeID = value; }
}
protected new void Assign(Employee otherEmployee)
{
base.Assign(otherEmployee);
EmployeeID = otherEmployee.EmployeeID;
}
}
그럼 우리가 관리자에 대해 동일한 예제를 따르
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
protected void Assign(Person otherPerson)
{
Name = otherPerson.Name;
}
}
이제 우리는 직원을 정의 서명을 사용하고 상속 된 클래스에 대한 얕은 복사 기능을 제공합니다.
이 패턴은 이전 개체와 동일한 데이터를 가진 NEW 개체를 만듭니다. 이전 개체는 여전히 존재하며 기존 참조는 새 개체를 가리 키지 않습니다. 사실 개체의 TYPE을 변경하는 것은 허용되지 않습니다.
"this.Field1 = baseInstance.Field1"이것은 내가 피하려고했던 것입니다. 대체 방법은 기본 클래스를 래핑하여 속성으로 표시하는 것입니다. 이것은 덜 악한 것처럼 보입니다 –
이 경우 나는 상속을 전혀 사용하지 않을 것입니다, 나는 기본 클래스의 인스턴스를 포함하는 새로운 클래스를 만들 것입니다. 그러나 Account 객체를 만드는 코드에 액세스 할 수있는 경우 AccountXtra 객체를 만드는 대신 해당 객체를 변경하면됩니다. 그렇다면 원하는대로 자유롭게 할 수 있습니다. –