8

假设我有两个类:

class Employee 

class AdvancedEmployee:Employee

我知道这样的事情是行不通的,因为我不能对 C# 失望:

var employee = new Employee();
var advanced = employee as AdvancedEmployee;

我的问题是:如何以有效的方式完成沮丧?实际上,我在 AdvancedEmployee 上有一个构造函数,它以 Employee 作为参数并使用它来注入其值,基本上是进行克隆。


更新

为了解决会被重复的数据,我稍微改变了方法,现在 AdvancedEmployee 包含一个员工,而不是一个员工本身。例子:

class Employee;

class AdvancedEmployee
{
   private employee

   public AdvancedEmployee(Employee employee){

    this.employee = employee

  }           

}
4

5 回答 5

5

它不能是强制转换,它实际上是不同类型之间的转换。

我会添加一个 ctor 或静态成员函数,例如AdvancedEmployee FromBase(Employee e),从给定的基类型构造派生类型。

于 2012-04-16T10:57:43.600 回答
5

创建一个接口。由于您无法修改 Employee,因此请创建一个您拥有的适配器

class EmployeeAdapter : IEmployee
{
    private Employee emp;
    public EmployeeAdapter(Employee emp) { this.emp = emp; }
    public int SomeMethodInEmployee() { return emp.SomeMethodInEmployee(); }
}

class AdvancedEmployee : IEmployee { } 
于 2012-04-16T11:10:15.963 回答
3

这是我过去处理过的一种方法,我认为这很酷...如果 Employee 和 AdvancedEmployee 中的所有数据元素都是属性,那么您可以使用反射将数据值从基类复制到派生类. 然后,您可以使用派生类,就好像他最初是以这种方式键入的,而不必封装基类。

public class Employee
{
    public int ID { get; set; }
    public string Foo { get; set; }

    public void SomeMethod() { }
}

public class AdvancedEmployee : Employee
{
    public string Bar { get; set; }

    public void SomeAdvMethod() { }
}

Employee emp = new Employee() { ID = 5, Foo = "Hello" };

// To create a AdvancedEmployee from emp
AdvancedEmployee advEmp = new AdvancedEmployee() { Bar = "A prop not in Emp that might need a value" }
foreach (var p in typeof(Employee).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => x.CanWrite))
    typeof(AdvancedEmployee).GetProperty(p.Name).SetValue(advEmp, p.GetValue(emp));
于 2016-04-20T19:58:33.413 回答
2

创建一个新对象是最易读和最清晰的方法。您还可以在 Employee 类中定义显式或隐式类型转换运算符。

public static explicit operator AdvancedEmployee(Employee e)
{
    return new AdvancedEmployee(e);
}

然后像这样使用它:

var e = new Employee();
var ae = (AdvancedEmployee) e;
于 2012-04-16T10:59:16.897 回答
1

as在 C# 中检查运行时类型。也就是说,如果被测试的对象确实不是AdvancedEmployee,你不会让它神奇地转换EmployeeAdvancedEmployee. 所以如果你需要一个AdvancedEmployee,你需要以某种方式自己构建它。

根据您要实现的目标,有不同的方法。也许您可以使用构造函数AdvancedEmployee(Employee proto),它将从proto? 或者,也许您需要EmployeeAdvancedEmployee.

请注意,您可能需要让存储旧员工的代码将其替换为新创建的AdvancedEmployee.

一种可行的方法(带有一些 Java 风格)可能是创建一个工厂,如果需要Employee,它将创建一个。AdvancedEmployee然后你需要让所有代码都使用工厂而不是创建一个Employeewith new。但是,如果您仍然需要更改运行时类型,这种情况将无济于事。

于 2012-04-16T10:58:02.053 回答