[asp.net]是它可能要访问不在的子元素类成员的父从父类类型引用变量指向子类对象类吗?

标签: Asp.net .Net C#
发布时间: 2017/3/26 1:37:38
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

按我的理解如果我有父类的类型引用变量指向一个子元素类对象︰

ParentClass obj= new ChildClass();

obj.OnlyMembersThatHavebeenDerivedFromParentAreAvailable// am i wrong? 

在下面的例子,我已经从点击这里我不应该能够访问 AnnualSalary

派生的类︰

 public class FullTimeEmployee : Employee
    {
        public int AnnualSalary { get; set; }
    }

派生的类︰

public class PartTimeEmployee : Employee
    {
        public int HourlyPay { get; set; }
        public int HoursWorked { get; set; }
    }

父类

 public class Employee
    {
        private int _id;
        private string _name;
        private string _gender;
        private DateTime _dateOfBirth;

        [DataMember(Order = 1)]
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        [DataMember(Order = 2)]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        [DataMember(Order = 3)]
        public string Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        [DataMember(Order = 4)]
        public DateTime DateOfBirth
        {
            get { return _dateOfBirth; }
            set { _dateOfBirth = value; }
        }

        [DataMember(Order = 5)]
        public EmployeeType Type { get; set; }
    }

下面的代码如何是有效的?:

Employee employee = null;
 employee = new FullTimeEmployee
                        {
                            Id = Convert.ToInt32(reader["Id"]),
                            Name = reader["Name"].ToString(),
                            Gender = reader["Gender"].ToString(),
                            DateOfBirth = Convert.ToDateTime(reader["DateOfBirth"]),
                            Type = EmployeeType.FullTimeEmployee,
                            AnnualSalary = Convert.ToInt32(reader["AnnualSalary"]) // how is AnnualSalary available here? 
                        };

解决方法 1:

你是正确的你不会写︰

employee.AnnualSalary = 1234;

但这不是你的案子。
您只使用对象初始值设定项来初始化 FullTimeEmployee (您有权访问的所有公共字段/属性) 的对象。
基本上,你在做下列操作︰

FullTimeEmployee employeeTemp = new FullTimeEmployee();
employeeTemp .AnnualSalary =2000;
Employee employee =employeeTemp;

更新

我认为一个人可以不定型父类别对象到子元素类对象,因为子元素可以做任何事情,父母可以但反过来不是真的。

再一次你是对的。
再一次,这不是您的案件......
该方法的返回类型可能是员工,但你返回的实际对象可能是别的东西 (派生类)。
在这种情况下你可以安全地将对象强制转换为您的派生类型。
下面的示例检查

namespace CastExample
{
  class Program
  {
    static void Main(string[] args)
    {
        Employee emp = GetEmployee();
        FullTimeEmployee full = (FullTimeEmployee)emp;
        System.Console.WriteLine(full.AnnualSalary);
        PartTimeEmployee part = (PartTimeEmployee)emp;//InvalidCastException
        System.Console.ReadLine();
    }

    static Employee GetEmployee()
    {
        return new FullTimeEmployee() { Name = "George", AnnualSalary = 1234   };
    }
  }
  public class Employee
  {
     public string Name;
  }
  public class FullTimeEmployee : Employee
  {
     public int AnnualSalary { get; set; }
  }
  public class PartTimeEmployee : Employee
  {
      public int HourlyPay { get; set; }
      public int HoursWorked { get; set; }
  }
}

并且他可以访问的专用属性太??

是的您可以访问使用反射的私有字段
找到一个私有字段用反射吗?
如何在 C# 中的私有字段的值?
c# 使用反射获取从派生类的私有成员变量

看看这个︰为什么可以在 C# 中的类的反射访问保护私有成员?
@Marc Gravell 答案解释为什么你可以做到这一点,但特别注意 @Tamas Czinege 答案 (我引用它在这里再一次)

成员可访问性是不是一种安全功能。它是有保护的程序员对他自己或她自己。它可以帮助执行封装,但它绝不是一种安全功能。

官方微信
官方QQ群
31647020