【发布时间】:2014-07-22 19:33:34
【问题描述】:
我目前正在自学 C# 的一些基本概念,并且正在尝试抽象类和多态性。我以为我掌握了基本概念,但事实证明这个概念并不像我理解的那样起作用:)。但是 - 我希望我能得到一些可以清除灰尘的答案:)。
我要完成的整个任务是扩展一个抽象基类并将扩展与基类的对象一起使用。喜欢这里:
我有一个抽象类,它实现了一个抽象属性,例如:
public abstract class BaseClass
{
public abstract MyProperty mP{get;}
}
房产在哪里
public abstract class MyProperty
{
public abstract string PropertyName{get;}
}
现在我正在为一个实际的实现派生 MyProperty 类,例如
public class DerivedProperty : MyProperty
{
public override string PropertyName
{
get
{
return this._name;
}
}
private _name = "Property1";
/* some other implementation follows here...... */
}
根据我对多态性和继承的理解,现在应该可以从 BaseClass 实例化派生类并使用 DerivedProperty 的对象覆盖属性 MyProperty,如下所示:
public class DerivedClass : BaseClass
{
public override DerivedProperty mP
{
get
{
return dP;
}
}
private DerivedProperty dP = new DerivedProperty();
/* more implementation follows here...... */
}
因为 DerivedProperty 同时是 MyProperty 和 DerivedProperty 的对象,所以可以在引用 MyProperty 或 DerivedProperty 的地方使用它。至少这是我的想法,但似乎这是错误的。 现在我想知道 - 为什么多态性在无法实现上述情况时如此有用?因为即使我尝试这样的事情:
public class DerivedClass : BaseClass
{
public override MyProperty mP
{
get
{
return dP as DerivedProperty;
}
}
private DerivedProperty dP = new DerivedProperty();
/* more implementation follows here...... */
}
我仍然只得到我的基础对象 MyProperty 而不是我想要得到的扩展对象 DerivedProperty。 我知道为什么我会得到这些结果——我只是觉得我不合逻辑:)。是真的像多态性应该工作还是我的实现只是废话,我必须以不同的方式来获得我的扩展属性?
在这里感谢您的帮助!
【问题讨论】:
-
只是为了让您知道。
m_、_通常是为私有字段保留的前缀(例如m_darkCage或_darkCage)。公共属性通常使用大写首字母命名(例如BrightRoom)。Property后缀是为依赖属性保留的。在现实生活中的示例中,您通常不会在类名中使用Class字符串(在此示例中可能还不错)。/* */cmets 通常用于注释代码块。文本 cmets 通常由//创建。你会发现大部分项目(大部分时间)都遵守这些规则。 -
这些规则有例外(例如,设计者创建的控件名称有时没有前缀
m_或_,但开发人员仍然接受这些)。学习 c# 命名约定很好,因为它们被广泛使用。
标签: c# polymorphism overriding abstract-class