2009-09-06 111 views
4

我想对性能C#访问修饰符与传承

比如我可能有讲座

public abstract class UserInfo 
{ 
    internal UserInfo() 
    { 
    } 
    public virtual int ID { get; set; } 
    public virtual string Password { internal get; set; } 
    public virtual string Username { get; set; } 
} 

public class ReadUserInfo : UserInfo 
{ 
    internal ReadUserInfo() 
    { 
    } 
    override public int ID { get; internal set; } 
    override internal string Password { get; set; } 
    override public string Username { get; internal set; } 
} 

public class NewUserInfo : UserInfo 
{ 
    internal NewUserInfo() 
    { 
     ID = -1; 
    } 
    //You get the Idea 
} 

用户具有不同的访问修饰符对象的多个版本,这是我的东西可以实施还是必须以更加程序化的方式控制访问?

+1

我要指出,当覆盖在“无法更改访问修饰符上述结果的代码‘阴毛’继承成员......错误 – 2009-09-06 21:43:43

+0

你是什么试图实现?你在寻找设计帮助,还是只是好奇这个方案是否会起作用? – 2009-09-06 22:26:33

+2

我必须同意Nader。在基类中声明一个属性public,然后将它隐藏在派生类中我会寻找一个新的方法来解决这个问题,也许一个接口是由一些类而不是其他人来解决你的问题 – ScottS 2009-09-06 22:30:20

回答

4

您可以使用新修改器:

public class ReadUserInfo : UserInfo 
{ 
    internal ReadUserInfo() 
    { 
    } 
    new public int ID { get; internal set; } 
    new internal string Password { get; set; } 
    new public string Username { get; internal set; } 
} 
+0

我测试过了,它实际上根本不起作用。基类中的“Password”属性在其他程序集中仍然可见。 – 2009-09-07 05:40:33

+0

当你从一个基地继承你正在创建一个新的类时,你不会修改基类的行为。当然,UserInfo的'Password'属性在程序集外部仍然可见,但ReadUserInfo.Password不是。 – manji 2009-09-07 08:30:18

+0

@najmeddine:正确,这意味着如果您在程序集中正确(或错误地)投射它,您将得到UserInfo.Password或ReadUserInfo.Password。这是这种方法的一部分问题。 – 2009-09-08 03:51:19

14

是继承真的在这里合适不合适? UserInfo类的用户不需要知道这些子类型。在这种情况下,用户需要知道在给定ReadUserInfo实例而不是UserInfo实例时,Password属性在某种程度上不可用。

这真的没有意义。

编辑:在面向对象的设计,这就是所谓的Liskov Substitution Principle

+0

这是半个实验性重写,半个人学习项目。我不确定我是否正朝着正确的方向前进。存储回基本类型时,我的行为也被误认为是错误的。所以,这是一个坏主意。感谢您的输入! – 2009-09-07 00:19:20