自动将成员和方法分配给某些类

时间:2013-02-10 16:37:45

标签: c#

我有很多具有以下成员/方法的类:

private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public bool isNamed(String name) { return getName().Equals(name); }

每次我创建一个具有成员“name”的新类时,我都必须重写所有这些。 有没有办法一次编写方法并使它们适用于我想要的任何类?

4 个答案:

答案 0 :(得分:3)

您只需定义一个基类(您可以将其抽象化):

public abstract class Named 
{
    public string Name { get; set; }    
}

并从中继承:

public class Person : Named 
{ 
}

在C#中你真的不需要isNamed,将字符串与==进行比较是完全安全的。


如果您的班级已经从另一个非Named的班级继承,您必须手动添加Name自动媒体资源或诉诸simulated multiple inheritance

或者,您可以为每个基类创建Named的特定修改:

public abstract class NamedLifeForm : LifeForm
{ 
    public string Name { get; set; }
}

public class Person : NamedLifeForm
{
    // Person inherits both a Name and all relevant members of LifeForm
}

另一种替代方法是创建一个通用包装器Named<T>,它将具有两个属性:NameT实例。但这会使构造和访问变得繁琐,所以我不推荐它。

答案 1 :(得分:3)

您的代码可以转换为:

public String Name { get;set;}

然后您可以这样使用它:

nObject.Name = "Stefan";
if(nObject.Name == "Stefan"){
   // do something
}else{
   // do something else
}

要自动应用于所有类,您只需将其设置为界面:

public interface INameable{
   public String Name {get;set;}
}

执行此操作将允许您从其他重要的基类继承。

点击此处查看example

class YourClass : INameable{
  //implementation
}

现在,YourClass自动插入“名称”属性。

答案 2 :(得分:2)

C#只有AutoProperties

public String Name {get; set; }

它处理你所谈到的getName()和setName()。

用法:
设置值:Name = "MyName;
获取值:string theName = Name;

答案 3 :(得分:0)

我建议阅读面向对象编程。你可以节省很多时间和精力(和he))。这是一个很好的引物http://www.amazon.com/Beginning-Object-Oriented-Programming-Dan-Clark/dp/1430235306

要回答您的具体问题,您应该阅读有关继承的内容。它允许您定义带有函数的“父”类。然后你可以继承“Child”类并具有相同的功能。

http://msdn.microsoft.com/en-us/library/ms173149(v=vs.80).aspx

这是一个代码示例

public class PersonBase
{
     private String name;
     public String getName()
     {
          return this.name;
     }
     public void setName(string name)
     {
          this.name = name;
     }
     public bool isNamed(string name)
     {
           return this.name.Equals(name);
     }
}

public class Employee : PersonBase
{
}

员工现在拥有PersonBase定义的任何内容。

正如其他人所指出的那样,您可以使用属性简化代码。您还应该在使用“this.name”之前检查空值。

以下是属性的链接: http://msdn.microsoft.com/en-us/library/x9fsa0sw(v=vs.80).aspx

简化的代码示例如下:

public class PersonBase
{
     public String Name { get; set; }
}

public class Employee : PersonBase
{
}

我希望这有助于您指明正确的方向来学习这些概念。