Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从父类调用方法并使用子类属性_C#_Oop_C# 4.0 - Fatal编程技术网

C# 从父类调用方法并使用子类属性

C# 从父类调用方法并使用子类属性,c#,oop,c#-4.0,C#,Oop,C# 4.0,实际通话: ChildClass classCall=new ChildClass(); classCall.FullName="test name"; string returnName=classCall.GetName(); 具有方法的父类: public class BaseClass { public string GetName() { // I can request the value of the property like this.

实际通话:

ChildClass classCall=new ChildClass();
classCall.FullName="test name";
string returnName=classCall.GetName();
具有方法的父类:

public class BaseClass
{
    public string GetName()
    {
        // I can request the value of the property like this.
        return this.GetType().GetProperty("FullName")
                   .GetValue(this, null).ToString();
    }
}
儿童班:

public partial class ChildClass : BaseClass
{
    public string FullName;
    public int Marks;
}

问题:如何避免对属性名称进行硬编码,即
GetProperty(“FullName”)
。我不想硬编码属性名称,而是使用其他方法并在父方法中使用它?

首先,我建议避免使用公共字段-如果要将状态公开,请使用属性。(您在反射调用中请求一个属性,但派生类声明了一个字段…)

此时,您可以在基类中使
FullName
成为一个抽象属性,并允许每个派生类按照自己的意愿实现它,但您仍然可以从基类调用它


另一方面,如果每个派生类都必须实现它,为什么不将它传递到基类的构造函数中呢?如果没有
FullName
字段,则当前代码将中断,那么为什么不将其放在基类中呢?

首先,我建议避免使用公共字段-如果要使状态公开,请使用属性。(您在反射调用中请求一个属性,但派生类声明了一个字段…)

    public class BaseClass
    {
        public virtual string GetName()
        {
            return string.Empty;
        }
    }

    public partial class ChildClass : BaseClass
    {

        public string FullName;
        public int Marks;

        public override string GetName()
        {
            return FullName;
        }
    }
此时,您可以在基类中使
FullName
成为一个抽象属性,并允许每个派生类按照自己的意愿实现它,但您仍然可以从基类调用它

另一方面,如果每个派生类都必须实现它,为什么不将它传递到基类的构造函数中呢?如果没有
FullName
字段,则当前代码将中断,那么为什么不在基类中使用它呢

    public class BaseClass
    {
        public virtual string GetName()
        {
            return string.Empty;
        }
    }

    public partial class ChildClass : BaseClass
    {

        public string FullName;
        public int Marks;

        public override string GetName()
        {
            return FullName;
        }
    }
但是,如果您永远不想初始化基类对象,则需要将其抽象化,并强制实现它的每个人实现其自己版本的GetName方法:

    public abstract class BaseClass
    {
        public abstract string GetName();
    }

但是,如果您永远不想初始化基类对象,则需要将其抽象化,并强制实现它的每个人实现其自己版本的GetName方法:

    public abstract class BaseClass
    {
        public abstract string GetName();
    }

BR

否;这是错误的。你到底为什么要用反射来做这个?为什么不使用多态性;或者将“FullName”放在基类中?如果创建了多个实体对象类,EF会自动从表中生成这些属性,在这种情况下,我想为每个实体创建一个分部类,创建一个基类,在基类中编写一个公共方法,然后对多个子类使用1个方法。@Sharpeye500:但是只有当表具有
FullName
属性时,基类才能工作,对吗?因此,在逻辑上属于基类。因此,修改T4模板以从基类派生;或者只是扩展部分生成的类!您不需要在这里进行反思。谢谢,任何快速示例都会有所帮助,再次非常感谢。不;这是错误的。你到底为什么要用反射来做这个?为什么不使用多态性;或者将“FullName”放在基类中?如果创建了多个实体对象类,EF会自动从表中生成这些属性,在这种情况下,我想为每个实体创建一个分部类,创建一个基类,在基类中编写一个公共方法,然后对多个子类使用1个方法。@Sharpeye500:但是只有当表具有
FullName
属性时,基类才能工作,对吗?因此,在逻辑上属于基类。因此,修改T4模板以从基类派生;或者只是扩展部分生成的类!您不需要在这里进行反射。谢谢,任何快速示例都会有所帮助,再次感谢。隐藏几乎从来都不比重写更受欢迎。你为什么不使用“虚拟”呢?帮助某人以稍微不那么疯狂的方式实现一个非常糟糕的设计并不是一个好主意。最好向他展示如何通过使用适当的语言特性来实现相同的设计目标。在这种情况下,
FullName
应该是虚拟或抽象属性,
GetName()
应该根本不存在。如上所述,
new
几乎从来都不比
virtual
更可取,而且在这种情况下绝对不可取,即使
GetName()
确实有任何存在的理由。当然,你是对的。第一种方法是尽可能少地修改他的代码,因为我对他的领域一无所知。但是,我现在包括了您的反馈:/隐藏几乎从来都不比覆盖更可取。你为什么不使用“虚拟”呢?帮助某人以稍微不那么疯狂的方式实现一个非常糟糕的设计并不是一个好主意。最好向他展示如何通过使用适当的语言特性来实现相同的设计目标。在这种情况下,
FullName
应该是虚拟或抽象属性,
GetName()
应该根本不存在。如上所述,
new
几乎从来都不比
virtual
更可取,而且在这种情况下绝对不可取,即使
GetName()
确实有任何存在的理由。当然,你是对的。第一种方法是尽可能少地修改他的代码,因为我对他的领域一无所知。但是,我现在包括了您的反馈:/