C# .NET继承:抑制基类中的属性

C# .NET继承:抑制基类中的属性,c#,.net,inheritance,C#,.net,Inheritance,考虑员工、经理和助理类: public class Emp { public string Name { get; set; } public Manager Manager { get; set; } public Assistant Assistant { get; set; } } public class Manager : Emp { } public class Assistant : Emp { } 目标是禁止一段代码访问如下属性: var foo

考虑员工、经理和助理类:

public class Emp
{
    public string Name { get; set; }
    public Manager Manager { get; set; }
    public Assistant Assistant { get; set; }
}

public class Manager : Emp
{ 
}

public class Assistant : Emp
{
}
目标是禁止一段代码访问如下属性:

var foo = new Manager();
var elmo = new Emp();
elmo.Manager = foo;
elmo.Manager.Manager = new Manager(); 
//how to disallow access to Manager.Manager ?
由于
Manager
继承自
Emp
,因此它具有
.Manager
.Assistant
属性

问题

在.NET的继承实现中是否有任何修饰符可以删除
.Manager
.Assistant
属性

更新

谢谢大家的精彩回答。我希望Emp/Mgr的简化和创新能在这个问题上体现出来。很明显,在本例中,继承应该被带到另一个公共性(比如
Person
,在这里类将共享名称、生日等)。非常感谢您的输入

没有

您可以将基类属性
设置为虚拟的
,然后重写它以在setter中引发异常,但无法给出编译时错误。毕竟,在编译时没有什么可以防止的

(elmo.Manager as Employee).Manager = new Manager();
然而,你可以写

public class ManagerEmployee : Emp {     
    public new ManagerEmployee Manager { 
        get { return base.Manager; }
    }
}

请注意,这不会阻止铸造。

否-因为它会断裂。基本上,你可以添加东西,但不能将它们拿走

您可能会重写该属性以在执行时抛出异常,但不能在编译时执行


一般来说,如果你不同意这种事情,你应该考虑组成而不是继承,因为你没有真正的继承关系。

这样做会违反,并且通常是一个可疑的设计的标志。一般来说,任何子类都应该能够在基类所属的任何上下文中使用。如果

Manager
s没有
.Manager
s,那么它们就不是
Emp
s,不应该继承它们。

正如其他人所说。不。我要补充一点,如果不是每个员工都有经理和助理,那么您的继承层次结构是错误的。似乎员工和经理之间唯一的共同点就是名字。您可以通过继承添加,但不能通过继承删除。

不,您不能这样做,您也不想这样做-要么经理是员工,有经理和助理,要么没有经理和助理,因此应该有不同的基类,即这种情况表明存在设计缺陷。一种可能是为这些属性返回null,不过如果这对域有意义的话。

像大多数事情一样,这取决于。鉴于以下类别:

public class foo
{
    public string Test { get { return "foo"; } } 
}

public class bar : foo
{
    public new string Test { get { return "bar"; } }
}
以及以下代码:

        bar a = new bar();
        // returns bar
        literalTest1.Text = a.Test;

        foo b = new foo();
        // returns "foo"
        literalTest2.Text = b.Test;

        foo c = new bar();
        // returns "foo"
        literalTest3.Text = c.Test;
根据上面的注释,可以看到您可以重写未声明为虚拟的属性。但是,仅当对象变量被声明为重写属性的类型时,才会使用重写属性,而不是作为其任何祖先。这有效地打破了多态性


改为修复您的祖先类。

对我来说似乎是个设计问题。虽然经理可能会向另一位经理汇报,但助理可能没有助理。也许基地应该是人。。。