이 두 가지 클래스가 있습니다.
abstract class BaseModel
{
...
public List<String> fields;
...
public DataSet select(){
//ex : this here the fields is null; but this class being abstract means
// I can only call this from an inherited class of this (child class)
// which will have the fields attributes override
this.fields.Count();
}
}
public class User : BaseModel
{
public new List<String> fields = new List<String> {
"id",
"email",
"name",
"password"
};
}
의 새 인스턴스를 User
만든 다음 select
메서드 를 호출하면 null
오류가 발생합니다. 필드 속성을 잘못된 방식으로 덮어 쓰고 있습니까?
public class User : BaseModel
{
public new List<String> fields = ...
}
당신은 당신이 new
원하는 것과 정확히 반대되는를 사용 하고 있습니다. new
이 필드가 기본 클래스의 비슷한 이름이 지정된 필드와 관련 이 없음을 선언합니다 .
여기에서 사용할 수있는 몇 가지 접근 방식이 있습니다. 개인적 선호도 순으로 :
필드를 다시 선언하지 말고 대신 생성자를 사용하십시오.
public abstract class BaseModel
{
public List<String> fields = new List<string>();
}
public class User : BaseModel
{
public User()
{
fields.AddRange(new List<String> {
"id",
"email",
"name",
"password"
});
}
}
기본 생성자를 사용할 수도 있습니다. 여기에서 필요하지 않을 수도 있지만 때로는 더 깨끗한 접근 방식입니다. 여기서 좋은 점은 기본 클래스가 파생 클래스가 필드 목록을 전달 하도록 강제 할 수 있으므로 개발자가 버그를 잊어 버리고 도입하는 것을 방지 할 수 있다는 것입니다.
public abstract class BaseModel
{
public List<String> fields;
public BaseModel(List<String> fieldsList)
{
this.fields = fieldsList;
}
}
public class User : BaseModel
{
public User() : base(new List<String> { "id", "email", "name", "password" })
{
}
}
기본 속성 (필드 아님!)을 virtual
(또는 abstract
)로 설정하고 파생 클래스에서 재정의합니다.
public abstract class BaseModel
{
public virtual List<String> fields { get; set; } = new List<string>();
}
public class User : BaseModel
{
public override List<String> fields { get; set; } = new List<String> { "id", "email", "name", "password" };
}
abstract
여기서도 일했을 것입니다.
여기에서 속성 대신 메서드를 사용할 수도 있습니다. 속성을 재정의 할 수는 없지만 일반적으로 메서드를 사용하여 수행됩니다.
public abstract class BaseModel
{
public virtual List<String> GetFields()
{
return new List<String>();
}
}
public class User : BaseModel
{
public override List<String> GetFields()
{
return new List<String> {
"id",
"email",
"name",
"password"
};
}
}
abstract
여기서도 일했을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다