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;
根据上面的注释,可以看到您可以重写未声明为虚拟的属性。但是,仅当对象变量被声明为重写属性的类型时,才会使用重写属性,而不是作为其任何祖先。这有效地打破了多态性
改为修复您的祖先类。对我来说似乎是个设计问题。虽然经理可能会向另一位经理汇报,但助理可能没有助理。也许基地应该是人。。。