覆盖具有相同名称但属性不同的属性

Joh*_*Tan 1 c# inheritance

我想知道是否有一种方法来覆盖派生类中具有不同类型的同名变量.有点像这样的东西(虽然这段代码不会编译):

public class A
{
    public virtual Point2D Point; // Represent a 2D point
}

public class B : A
{
    public override Point3D Point; // Represent a 3D point
}
Run Code Online (Sandbox Code Playgroud)

这样做的原因是,A并且B可能共享相似的属性,只是它的维度Point不同.

Zoh*_*led 6

您无法覆盖它,但可以使用new关键字来刺激覆盖(遮蔽)。

注意:如果对 B 类的引用是 A 类型,您将获得 A 属性,而不是 B 属性。
这意味着在使用 new 关键字来隐藏基类属性时必须非常小心。

这是一个new关于和之间差异的StackOverflow 帖子override

new当派生类属性类型是从基类属性类型派生时,使用关键字而不是重写属性可能非常有用。


KAI*_*KAI 5

你在说什么Generics.

public class YourBaseClass<T>
    where T: class
{
    public T Point { get; set; }
}

public class A : YourBaseClass<Point2D>
{
}

public class B : YourBaseClass<Point3D>
{
}
Run Code Online (Sandbox Code Playgroud)

所以,当你打电话的时候

var a = (new A()).Point;
var type = a.GetType();
Run Code Online (Sandbox Code Playgroud)

A实例的点的类型是Point2D(或者null在此示例中,因为引用类型属性尚未初始化.)

var point2D = (new A()).Point as Point2D;
Run Code Online (Sandbox Code Playgroud)

注意:在这种情况下使用泛型的原因是Point为派生类指定属性的返回类型.
使用泛型比使用virtual关键字更好的解决方案是为了隐藏基类的属性并定义一个属性new(也就是执行阴影).现在你有一个具有"可设置"返回类型的基本属性,而不是具有相互隐藏的多个属性.


归档时间:

查看次数:

929 次

最近记录:

9 年,4 月 前