我对继承很新,想问问题。我有一个基类,它有许多功能,由许多派生类共享。
每个派生类的唯一区别是名为Name的单个方法。每个派生类的功能都相同,但需要名称区别。
我在名为Name的基类中有一个属性。我如何安排它,以便派生类可以覆盖基类属性?
感谢。
答案 0 :(得分:4)
将您的方法声明为virtual
public class A
{
public virtual string Name(string name)
{
return name;
}
}
public class B : A
{
public override string Name(string name)
{
return base.Name(name); // calling A's method
}
}
public class C : A
{
public override string Name(string name)
{
return "1+1";
}
}
答案 1 :(得分:3)
使用virtual属性:
class Base
{
public virtual string Foo
{
get;
set;
}
}
class Derived : Base
{
public override string Foo
{
get {
// Return something else...
}
set {
// Do something else...
}
}
}
答案 2 :(得分:3)
您可以在基类中使用虚拟或抽象关键字声明它,然后派生类可以覆盖它
答案 3 :(得分:2)
您需要将您的属性(在基类中)声明为virtual
答案 4 :(得分:2)
要使每个派生类重写属性,您只需将属性标记为虚拟
class Base {
public virtual Property1 {
get { ... }
set { ... }
}
}
答案 5 :(得分:2)
嗯,我不能从你的描述中确定继承实际上是解决问题的正确方法,但是这里是如何使属性被覆盖的:
class Base
{
public virtual string Name { get; set; }
}
但你需要它可写吗? readonly属性可能更有意义,在这种情况下这可能有效:
class Base
{
public virtual string Name
{
get { return "BaseName"; }
}
}
class Derived : Base
{
public override string Name
{
get { return "Derived"; }
}
}
答案 6 :(得分:2)
在基类中:
public virtual string Name { get; set; }
在派生类中:
public override string Name { get; set; }
但是,如果类之间的唯一区别是它们具有不同的名称,我认为不应该继承,而应该只使用构造函数中设置了Name的基类:
e.g。
public class MyObject
{
public string Name { get; private set; }
public enum ObjectType { TypeA, TypeB, ... }
public MyObject(ObjectType obType)
{
switch (obType)
{
case ObjectType.TypeA:
Name = "Type A";
// and so on
}
}
}